`

log4j 日志配置

阅读更多

 

log4j 大概的配置方式可分为 2 种:

 

第一种: log4j.xml 配置

1、 导入架包 log4j-1.2.17.jar

        查看附件

2、 写 log4j.xml 的配置内容(部分示例)

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> -->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="null" debug="null">
    
	<!-- FATAL > ERROR > WARN > INFO > DEBUG -->
	<!-- ============================================== -->
	<!-- appender definitions (输出端定义) -->
	<!-- ============================================== -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %-4r [%t] %-5p %c %x %l %m%n" />
		</layout>
		<!--过滤器设置输出的级别 -->
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="levelMin" value="debug" />
			<param name="levelMax" value="warn" />
			<param name="AcceptOnMatch" value="true" />
		</filter>
	</appender>
	
	<!-- 输出日志到指定日志文件  -->  
	<appender name="file" class="org.apache.log4j.FileAppender">
        <!-- 设置File参数:日志输出文件名 -->
		<param name="File" value="c:/logs/springmvc_logs/file.log"/>
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
        <param name="Append" value="true" />
        <!-- 设置文件大小 -->
        <param name="MaxFileSize" value="1MB" />
        <!-- 设置文件备份 -->
        <param name="MaxBackupIndex" value="100" />
        <!-- 设置输出文件项目和格式 -->
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d|[%t]|%-5p|%c| - %m%n"/>
		</layout>
	</appender>
	<!-- 输出日志到指定日志文件 每天一个日志 -->
	<appender name="file_daily" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="c:/logs/springmvc_logs/file_dayly.log" />
		<param name="Append" value="true"/>
		<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
		</layout>
	</appender>
	
	<!-- ============================================== -->
	<!-- root logger (基础logger定义, 没有定义的logger用这个默认的配置) -->
	<!-- ============================================== -->
	<root>
		<level value="${rootlevel}"/>
		<appender-ref ref="console" />
		<appender-ref ref="file_daily" />
	</root>
	
	<!-- ============================================== -->
	<!-- logger definitions (logger定义) additivity 是否遵循缺省的继承机制 root logger,会出现重复日志 -->
	<!-- ============================================== -->
	<logger name="com.lw.controller" additivity="false">
		<level value="INFO" />
		<appender-ref ref="console" />
		<appender-ref ref="file_daily" />
		<appender-ref ref="file" />
	</logger>
	
</log4j:configuration>

 

 

3、 web.xml 导入log4j.xml 配置

 

	<!-- 配置加载log4j.xml文件路径 --> 
	<context-param>
	    <param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/log4j.xml</param-value>
	</context-param>
	<!-- 配置log4j.xml变量 -->
	<context-param>
		<param-name>rootLevel</param-name>
		<param-value>DEBUG</param-value>
	</context-param>
	<context-param>
		<param-name>loggingLevel</param-name>
		<param-value>INFO</param-value>
	</context-param>
	<!-- 配置log4j.xml监听器 -->
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>

 

 

4、 在需要写日志的类中实例化 log4j的日志类

 

@Controller
public class HelloController {

    protected Logger log = Logger.getLogger(HelloController.class);
//    protected Logger log = Logger.getLogger("com.lw.controller");
    
    @RequestMapping("index")
    public ModelAndView index() {
	log.info("===============进入 Index 方法");
	String str = "Hello World. <br/>This is page index";
	return new ModelAndView("index", "str", str);
    }

 

 

 

第二种: log4j.properties 属性文件配置

1、导入架包(同上)

2、log4j.properties 属性配置

 

log4j.rootLogger=info, ServerDailyRollingFile, stdout

### 每天生产一个日志文件
log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.ServerDailyRollingFile.DatePattern='-'yyyy-MM-dd'.log' 
log4j.appender.ServerDailyRollingFile.File=C:/logs/mylog.log 
log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n 
log4j.appender.ServerDailyRollingFile.Append=true

### 输出控制台 appender
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

 

 

3、web.xml 配置导入 log4j.properties属性文件、 代码中硬编码导入log4j.properties

 

<!--     log4j.properties 日志配置属性文件 -->
    <context-param>  
        <param-name>log4jConfigLocation</param-name>  
       <param-value>/WEB-INF/log4j.properties</param-value>  
    </context-param>

 或者

PropertyConfigurator.configure("log4j.properties"); 

// a). 代码中,PropertyConfigurator.configure("bin/log4j.properties"); 
// b). 代码中,PropertyConfigurator.configure(ClassLoader.getSystemResource("log4j.properties"));


 

4、需要写日志的类中实例化日志类(同上)

 

相关问题及解决方案:

DailyRollingFileAppender(每天产生一个日志文件),  每天生成新文件的时候,  会调用一个 renameTo 的方法, 就是把日志文件改成当前日期对应的文件,  如: mylog.log > renameTo > mylog.log.2015-05-15.log时, 由于 mylog.log 已经打开,在window下是不允许重命名操作的, 所以会报错。 所以改用 复制文件的方式, 自定义copy方法, 代码如下:

原来用的是:


 

修改以后是:


 

    /**
     * Copies src file to dst file. If the dst file does not exist, it is
     * created.4KB cache
     * 日志文件拷贝好以后, 清空原文件的内容, 保证每次记录的只有当天的内容
     * 
     * @param src
     * @param dst
     * @throws IOException
     */
    boolean copy(File src, File dst) throws IOException {
	try {
	    int leave = 1000 * 4; //1024 * 1000; // 文件剩下的字符数 1MB = 1024KB = 1024 * 1000Byte
	    byte[] inOutb;// byte数组接受文件的数据
	    
	    FileInputStream in = new FileInputStream(src);
	    FileOutputStream out = new FileOutputStream(dst);

	    // 剩余的流数据
	    inOutb = new byte[leave];
	    in.read(inOutb, 0, leave);
	    out.write(inOutb);
	    out.flush();

	    in.close();
	    out.close();
	    
	    // 源文件, 清空时需要
	    FileOutputStream out1 = new FileOutputStream(src);
	    // copy好源文件后,  清空原日志文件内容
	    out1.write("".getBytes());
	    out1.close();
	    return true;
	} catch (FileNotFoundException e) {
	    LogLog.error("源文件不存在,或者目标文件无法被识别.");
	    return false;
	} catch (IOException e) {
	    LogLog.error("文件读写错误.");
	    return false;
	}
    }

 

 

附:  log4j 配置参数说明

log4j.rootLogger=日志级别,appender1, appender2, ….

  • 日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不区分大小写
  • 注意,需在控制台输入,只需将其中一个appender定义为stdout即可
  • 注意,rootLogger默认是对整个工程生效
  • 注意,如果只想对某些包操作,那么:log4j.logger.com.hutu=info, stdout,表示该日志对package com.hutu生效
  • 注意,这样做可以区分dev/线上,也可以减小性能影响:if(log.isDebugEnabled()){log.debug();}

红唇 log4j.appender.appender1=org.apache.log4j.日志输出到哪儿

  • ConsoleAppender(控制台)
  • FileAppender(文件)
  • DailyRollingFileAppender(每天产生一个日志文件)
  • RollingFileAppender(文件大小到达指定尺寸时产生一个新的文件)
  • WriteAppender(将日志信息以流格式发送到任意指定的地方)
  • JDBCAppender(将日志信息保存到数据库中)

红唇 log4j.appender.appender1.File=文件目录及文件

${user.home}/logs/...

红唇 log4j.appender.appender1.MaxFileSize=最大文件大小

红唇 log4j.appender.appender1.MaxBackupIndex=备份文件个数

  • 其中,appender1是在第一行定义过的;
  • 文件目录及文件,例如,/home/admin/logs/hutudan.log
  • 最大文件大小,例如,100KB
  • 备份文件个数,例如,1

红唇 log4j.appender.ServerDailyRollingFile.DatePattern=日志后缀格式

  • 例如,'-'yyyy-MM-dd'.log'

红唇 log4j.appender.appender1.layout=org.apache.log4j.日志布局格式

  • HTMLLayout(以HTML表格形式布局)
  • SimpleLayout(包含日志信息的级别和信息字符串)
  • TTCCLayout(包含日志产生的时间,执行绪,类别等信息)
  • PatternLayout(可以灵活的指定布局格式,常用

红唇 log4j.appender.appender1.layout.ConversionPattern=日志输出格式

  1. 例如,%d - %m%n或%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
  2. %c 输出日志信息所属的类的全名
  3. %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
  4. %f 输出日志信息所属的类的类名
  5. %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
  6. %m 输出代码中指定的信息,如log(message)中的message
  7. %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
  8. %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
  9. %r 输出自应用启动到输出该日志信息所耗费的毫秒数
  10. %t 输出产生该日志事件的线程名
  11. 可参考:http://blog.sina.com.cn/s/blog_4e4dd5570100qowy.html

红唇 log4j.appender.ServerDailyRollingFile.Append=true

  • 例如,不解释,追加往后写便是

红唇 总结一下:

  • Logger类:完成日志记录,设置日志信息级别
  • Appender类:决定日志去向,终端、DB、硬盘
  • Layout类:决定日志输出的样式,例如包含当前线程、行号、时间

 

 

 

  • 大小: 173.2 KB
  • 大小: 14.7 KB
  • 大小: 12.3 KB
分享到:
评论
1 楼 威化考拉 2017-12-19  
不错

相关推荐

Global site tag (gtag.js) - Google Analytics