前段时间由于需要将项目部署到服务器,由于习惯了打印到控制台DEBUG追踪,部署到服务器后发现光关控制台信息很难追踪到问题所在,并且控制台还不能复制打印的信息,所以下定决心自己将项目的日志输出到自己能够随时查看的文件夹中。
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG、ALL,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。
一、首先你有一个Web项目 其次你得准备好log4j的依赖包 log4j-1.2.15.jar commons-logging-1.0.4.jar 分别测试了下 2个依赖包缺一不可,否则就会报错。
二、在你的项目根目录下的WEB-INF 新建log4j配置 取名log4j.properties 位置和文件名你都可以重新指定,只要在后续配置下能够根据路径找到这个配置就行。一般采取约定熟成的方式。
log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
1. rootLogger 指的是配置log4j level 包括了5种 文章开始指明 这里意思只打印 INFO 级别以上的信息。
appenderName1 appenderName2
... 指的将日志信息输出到哪个地方 由下面具体指定
2.appender具体指定将日志信息打印在哪
1.org.apache.log4j.ConsoleAppender(控制台),
2.org.apache.log4j.FileAppender(文件),
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个 新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3.layout 配置日志信息的格式(布局)
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
具体log4j配置网上一搜一大把,这里就不再赘述了。下面是我的配置的具体含义
log4j.rootLogger=info,ServerDailyRollingFile,stdout log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=D:/hang222/hlserverlogs/hlserver.log log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
1.1ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件 以及在后续定义了打印日志时间的格式和日志的路径,其中路径你可以采用相对路径 其中只需要修改D:/hang213/hlserverlogs/hlserver.log,
1.1.1普通相对路径:
log4j.appender.logfile.File=../logs/app.log,将日志记录到tomcat下的logs文件夹;
1.1.2环境变量的相对路径:(其他需要可以自行网上搜索)通过在程序里打印可以定位到你想的位置
System.out.println("Java运行时环境版本:/n"+System.getProperty("java.version"));
log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器时${user.dir}对应tomcat的bin目录;
1.2
stdout= org.apache.log4j.ConsoleAppender 打印在控制台
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("初始化log4j日志组件");
}
}
三、在Web.xml配置log4j
用于项目自动加载log4j的配置
<!-- 加载Log4J 配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
项目在运行时就会根据设置的路径将log4j的配置加载,log4jRefreshInterval这是设置每3秒扫描查看配置是否发生变化,等同于动态加载,不过一般不需要可以去掉,上面使用监听器,当然也可以servlet实现,原理相同:只需将listener换成servlet
<servlet>
<servlet-name>log4j</servlet-name>
<servlet-class>
org.springframework.web.util.Log4jConfigServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
到此 我们的log4j就配置完成了,在项目中需要打印日志的方法时:
private static Logger logger = Logger.getLogger(类名.class);
logger.info("打印的日志"+需要打印的参数等);
到此over 查看下完成没有:控制台
文件:
当然由于配置了
DatePattern 你的前面日志文件会自动生成
hlserver.log.2017-10-18
我了解的还有一种就是通过servlet初始化init()方法中加载file属性实现相对路径
原理相同 写一个类 用于加载log4j的配置 并在WEB.xml配置这个类并加载他。
/WEB-INF/config/log4j.properties
log4j.appender.AFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.AFile.DatePattern='.'yyyy-MM-dd'.html'
log4j.appender.AFile.File=..//webapps//logs//d1cm_log.html
log4j.appender.AFile.layout=org.apache.log4j.HTMLLayout
log4j.appender.AFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c %m %n
com.lq.utils.ConfigServlet.java
public
class ConfigServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
super.init(config);
//初始化log4j日志组件
initLogConfig(config);
}
private void initLogConfig(ServletConfig config) {
String prifix = getServletContext().getRealPath("/");
//System.out.println(prifix);
//获取log4j配置文件地址
String Log4jFile = config.getInitParameter("Log4jFile");
//System.out.println(Log4jFile);
String filePath = prifix + Log4jFile;
//System.out.println(filePath);
PropertyConfigurator.configure(filePath);
Properties props = new Properties();
/* try {
String Log4jFileSavePath = config.getInitParameter("Log4jFileSavePath");
//System.out.println(Log4jFileSavePath);
FileInputStream log4jStream = new FileInputStream(filePath);
props.load(log4jStream);
log4jStream.close();
//设置日志保存地址
String logFile = prifix + Log4jFileSavePath + File.separator + "d1cm_log.html" ;
//System.out.println(logFile);
props.setProperty("log4j.appender.AFile.File", logFile);
PropertyConfigurator.configure(props); //装入log4j配置信息
} catch (IOException e) {
e.printStackTrace();
}*/
System.err.println("初始化log4j日志组件");
}
}
web.xml
<!-- 系统初始化配置信息 servlet -->
<servlet>
<servlet-name>configServlet</servlet-name>
<servlet-class>com.common.config.ConfigServlet</servlet-class>
<init-param>
<param-name>Log4jFile</param-name>
<param-value>/WEB-INF/config/log4j.properties</param-value>
</init-param>
<init-param>
<param-name>Log4jFileSavePath</param-name>
<param-value>/logs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
第三种照着这个网址实现:也就没怎么研究了,大同小异,都是将配置加载
http://blog.csdn.net/longaohun/article/details/6233099
实现完了发现控制台还好,日志文件中每次启动重新启动项目就老是显示很多不需要的信息,严重干扰了阅读查错,
网站上找了半天解决办法,什么不打印Spring的相关等,最后幡然醒悟,你将一个成熟的项目部署到服务器后,很少会不断的重启服务,自己想多了。。。。。不知道会不会有人和我一样陷入怪圈。