log4j输出指定功能的log配置方式区别
日志的配置文件有两种:
第一
### 设置### 1p:表示日志的输出级别,2p:定义了一个名称用来代表输出到控制台的,....3p:全局的日志类型
log4j.rootLogger = debug,cansole
### 输出信息到控制抬 ###
log4j.appender.cansole = org.apache.log4j.ConsoleAppender
log4j.appender.cansole.Target = System.out
log4j.appender.cansole.layout = org.apache.log4j.PatternLayout
log4j.appender.cansole.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 自定义的日志类型:sceneTest1, SceneTest1:是索引的值
log4j.logger.SceneTest1= debug,sceneTest1
log4j.appender.sceneTest1=org.apache.log4j.FileAppender
log4j.appender.sceneTest1.File =F://logs/sceneTest1.log
log4j.appender.sceneTest1.layout = org.apache.log4j.PatternLayout
log4j.appender.sceneTest1.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 自定义的日志类型:sceneTest2, SceneTest2:是索引的值
log4j.logger.SceneTest2= debug,sceneTest2
log4j.appender.sceneTest2=org.apache.log4j.FileAppender
log4j.appender.sceneTest2.File =F://logs/sceneTest2.log
log4j.appender.sceneTest2.layout = org.apache.log4j.PatternLayout
log4j.appender.sceneTest2.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
不使用类,而是使用loggerName来创建日志:
#json是用java代码创建logger时用name,而不是jsonlog,注意,不需要在rootLogger中再配置,否则其它无关信息也将输出到jsonlog中
log4j.logger.json=DEBUG,jsonlog
log4j.additivity.json=false
log4j.appender.jsonlog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.jsonlog.File = logs/jsonlog.log
log4j.appender.jsonlog.Append = true
log4j.appender.jsonlog.Threshold = INFO
log4j.appender.jsonlog.layout = org.apache.log4j.PatternLayout
log4j.appender.jsonlog.layout.ConversionPattern =%5p %d %C: %m%n
java创建日志的方法
1
|
Logger logger=Logger.getLoger( "json" ); |
第二中、xml的配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- * 1. 一个appender子元素定义一个日志输出目的地 * 2. 一个logger子元素定义一个日志写出器 --> <!-- catalina.out --> <appender name="consoleAppend" class="org.apache.log4j.ConsoleAppender" > <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%5p][%t][%c{1}]-[%M] %m%n" /> </layout> </appender> <!-- error log --> <appender name="errorAppend" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/SceneTest1.log" /> <param name="Append" value="true" /> <param name="MaxBackupIndex" value="10" /> <param name="MaxFileSize" value="4000000" /> <param name="encoding" value="utf-8"/> <layout class="org.apache.log4j.PatternLayout" > <param name="PatternConverter" value="%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n"/> </layout> </appender> <!-- logger的作用: 1.[name属性]:指定你定义Logger对象时候的name 2. additivity : children-logger是否使用 rootLogger的配置, additivity在log4j默认为true。这解释了为什么有些时候,一个日志信息在屏幕上会有多次输出。 3.还可以指定level(输出级别)、appender-ref(指定哪个append) --> <!-- loggers 定义的日志场景SceneTest1 --> <logger name="SceneTest1" additivity="true"> <!-- 如果1个包想对应多个 Appender 就这样,对于每个Appender自定义的日志级别可以在Appender上加上filter --> <appender-ref ref="errorAppend" /> </logger> <!-- root的作用(相当于全局的意思): 1.[priority ]:指定默认的全局输出级别 2.[appender-ref ]:指定一些默认的append(没有指出特殊包或者类,即那些没有指定<logger>元素的append)的输出; --> <root> <priority value="INFO" /> <!-- 将 logger 中 additivity=true 的日志或者没有指定<logger>的append输出到控制台 --> <appender-ref ref="consoleAppend" /> <!-- 将全局的 error 日志输出到error文件中 --> <!--<appender-ref ref="errorAppend" />--> </root> </log4j:configuration>
这两种方式大同小异。稍微做下对比就可以知道了。
除了配置文件的形式配置日志,还能通过代码动态的配置属性和文件
比如,1、动态的初始化配置代码
/* * 动态获取配置信息 */ public static Properties getProperties(){ Properties pp = new Properties(); pp.put("log4j.rootLogger", "info"); pp.put("log4j.logger.SceneTest2","debug,sceneTest2"); pp.put("log4j.appender.sceneTest2", "org.apache.log4j.FileAppender"); pp.put("log4j.appender.sceneTest2.File", "${webapp.root}/logs/SceneTest2.log"); pp.put("log4j.appender.sceneTest2.layout", "org.apache.log4j.PatternLayout"); pp.put("log4j.appender.sceneTest2.layout.ConversionPattern", "%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m -(:%L)%n"); return pp; } PropertyConfigurator.configure(CoustomLogger.getProperties());
2、可以往这个logger里面添加Appender,应用于多个功能或者场景下输出到不同的日志文件等。
public static Appender getAppender(){ Layout layout = new PatternLayout("%d %p [%c] - %m%n"); Appender appender = null; try { appender= new FileAppender(layout,"F://logs/sceneTest3.log"); } catch (IOException e) { e.printStackTrace(); } return appender; }
3、最后添加这个控制台,和xml配置的<logger/>标签很类似。
PropertyConfigurator.configure(CoustomLogger.getProperties()); Logger logger = Logger.getLogger("SceneTest2"); logger.addAppender(CoustomLogger.getAppender()); logger.debug("debug logger out ");
总结,配置log4j可以通过动态和静态配置。可以实现不同的功能模块输出logger到不同的控制器
如果采用静态配置文件的形式配置的话,启动方式有:
1、如果是xml配置文件,可通过web.xml的相关配置来初始化配置
,也可以在在spring bean容器中配置:
<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> <property name="targetMethod" value="initLogging" /> <property name="arguments"> <list> <value>classpath:log4j.xml</value> </list> </property> </bean>
2、如果是properties文件,则在web.xml中配置初始化