Log4j是什么、有什么
介绍
是什么
有什么
Log4j能干什么
能干什么
日志类别的层次结构(Loggers)
Log4j首要的相对于简单的使用System.out.println()方法的优点是基于它的在禁止一些特定的信息输出的同时不妨碍其它信息的输出的能力。这个能力源自于日志命名空间,也就是说,所有日志声明的空间,它根据一些开发员选择的公式而分类。
日志级别
Log4j有如下级别
几个重要规则
如何获得日志操作类
public class A { private static Logger logger = Logger.getLogger(A.class); }
输出源
输出源
常见Appender
org.apache.log4j.ConsoleAppender(控制台) org.apache.log4j.FileAppender(文件) org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) org.apache.log4j.jdbc.JDBCAppender(把日志用JDBC记录到数据库中)
布局
布局
常见Layout
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
最常用的PatternLayout
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
配置示例
配置
nproperties配置示例如下:
log4j.rootLogger=error,javass.Console,javass.File log4j.appender.javass.Console=org.apache.log4j.ConsoleAppender log4j.appender.javass.Console.layout=org.apache.log4j.PatternLayout log4j.appender.javass.Console.layout.ConversionPattern=%d{HH:mm:ss,SSS} %5p (%C{1}:%M) - %m%n
log4j.appender.javass.File=org.apache.log4j.DailyRollingFileAppender log4j.appender.javass.File.file=javass.log log4j.appender.javass.File.DatePattern=.yyyy-MM-dd log4j.appender.javass.File.layout=org.apache.log4j.PatternLayout log4j.appender.javass.File.layout.ConversionPattern=%d{HH:mm:ss,SSS} %5p (%C{1}:%M) - %m%n log4j.logger.cn.javass=debug
Appender、Layout、Logger三者之间的关系
通过前面的讲解,我们可以在配置文件中看出以下关系:
配置示例
xml配置示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="test" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" /> </layout> </appender>
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="E:/test.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" /> </layout> </appender> <logger name="cn.javass" additivity="true"> <level value="debug" /> <appender-ref ref="file" /> </logger> <root> <level value="error"/> <appender-ref ref="test" /> <appender-ref ref="file" /> </root> </log4j:configuration>
log4j.xml比log4j.properties多的功能
<appender name="log.file" class="org.apache.log4j.DailyRollingFileAppender"> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="info" /> <param name="levelMax" value="info" /> <param name="AcceptOnMatch" value="true" /> </filter> </appender>
<logger name="cn.javass1" additivity="false"> <level value="debug" /> <appender-ref ref="log.console" /> <appender-ref ref="log.file" /> </logger>
在java中使用log4j中要注意的小问题
看似奇怪的重复级别判断:我们在看一些成熟框架的源代码中,经常看到如下代码:
if (logger.isDebugEnabled()){ logger.debug(“debug:“+name); }
jdk内置的日志系统
配置示例
handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler #.level= ALL # default file output is in user's home directory. java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # Limit the message that are printed on the console to INFO and above. java.util.logging.ConsoleHandler.level = FINEST java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# messages: #cn.javass.level = SEVERE cn.javass.level = WARNING #cn.javass.level = INFO #cn.javass.level = CONFIG #cn.javass.level = FINE #cn.javass.level = FINER #cn.javass.level = FINEST
在java中使用jdk内置的日志系统
声明一个logger:
private static final Logger logger = LoggerFactory.getLogger(“cn.javass.Test”);
输出信息:
logger.finest("This is finest Level"); logger.finer("This is finer Level"); logger.fine("This is fine Level"); logger.config("This is config Level"); logger.info("This is info Level"); logger.warning("This is warning Level"); logger.severe("This is severe Level");
使用classpath下的logging.properties
如果想使用自定义的logging.properties,只需要保证这段代码运行在getLogger之前即可:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("logging.properties"); if (inputStream != null) { try { LogManager.getLogManager().readConfiguration(inputStream); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
slf4j简介
slf4j门面原理
在java中使用slf4j
获得logger对象:
private static final Logger logger = LoggerFactory.getLogger(Test.class); 输出日志信息: logger.debug(“debug”);
slf4j中的占位符—不再需要冗长的级别判断
原创内容 转自请注明【http://sishuok.com/forum/blogPost/list/0/3740.html#8838】