log4j,slf4j (日志记录工具)

    xiaoxiao2026-03-18  8

    一个logger对应着若干个appender和一个日志级别。

    一个appender对应着一个输出位置与格式。

    1.获取

    <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>

    需要的jar包、log4j.properties文件等项目结构见图1。

    图1 log4j.properties文件的默认位置

    也可以自己指定配置文件路径,见下;

    void org.apache.log4j.PropertyConfigurator.configure(String configFilename)

    2.日志格式

    layout指定了布局与内容。常用的见下表:

    Layout类名 作 用 org.apache.log4j.HTMLLayout 以HTML表格形式布局 org.apache.log4j.PatternLayout 可以灵活地指定布局模式 org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串 org.apache.log4j.TTCCLayout 包含日志产生的时间、线程、类别等等信息 其中 PatternLayout最为灵活,它的一些格式占位符见下:

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

    如下行配置的显示效果见下下行; log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p]-[%l] %m%n 

    2015-08-03 10:52:23 [com.ctrip.search.antibot.esper.worker.RuleWorker]-[DEBUG]-[com.ctrip.search.antibot.esper.worker.RuleWorker.modifyAntibotEplTable(RuleWorker.java:54)] 日志具体内容

    3.常用函数

    void com.ctrip.search.logging.ESLogger.error(String msg, Object... params)

    用于记录string。

    void com.ctrip.search.logging.ESLogger.error(String msg,Throwablecause, Object... params)

    我们catch(Exception e)到的异常都是Throwable类型的,若想打印错误栈信息,可将e放入此函数的第二个实参位置上,log4j就帮我们打印调用栈了。

    比如logger.error(e,e),就等价于logger.error(e.toString(),e),就等价于logger.error(e.getMessage(),e);。

    注意:若程序抛出了RuntimeException e,而我们没有try{}catch{ logger.error(e,e)},那么日志中就没有这个异常信息。所以启动脚本一般会这么写;

    4.例子

    log4j.properties文件内容见下:

    #可以设置级别:debug>info>error #debug:显示debug、info、error #info:显示info、error #error:只error #log4j.rootLogger=debug,appender1 #输出到多个目的地 log4j.rootLogger=info,appender1,appender2 #log4j.rootLogger=error,appender1 #输出到控制台 log4j.appender.appender1=org.apache.log4j.ConsoleAppender #样式为TTCCLayout log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout #输出到文件,每天一个文件 log4j.appender.appender2=org.apache.log4j.DailyRollingFileAppender #指定输出文件,${catalina.home}为tomcat启动时设置的变量,就是tomcat工作目录 log4j.appender.appender2.file=${catalina.home}/logs/qing-WebLog.log #样式为TTCCLayout log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout对应的效果见图2: 图2 与上面配置对应的输出内容 qing-WebLog.log是总记录。每过一天会把当天的单独写到带日期的文件里。

    5.多个logger

    多个logger更为灵活,可以记录特定的信息。比如自己的项目proA依赖了proB,proB里面有很多打日志的代码,干扰了我们proA的业务日志,那么就可以让它们使用不同的logger,记往不同的地方。 有两种做法——限定包名或指定logger名字。

    5.1 指定logger名字

    log4j.logger.myLogger=info,appender3 #若不加这一行,rootLogger同样会记载此logger的日志 log4j.additivity.myLogger=false log4j.appender.appender3=org.apache.log4j.ConsoleAppender log4j.appender.appender3.layout=org.apache.log4j.TTCCLayout对应的java语句见下: static final Logger myLogger = LoggerFactory.getLogger("myLogger");

    5.2 限定包名

    如 log4j.logger. com.likeyichu.proa=info,myAppender 在java中正常用 Logger logger=Logger.getLogger(myClass.class);

    6.自定义appender

    例子见下。 #use own appender log4j.rootLogger = INFO,YICHU log4j.appender.YICHU = com.yichudu.logger.appender.YichuAppender log4j.appender.YICHU.layout = org.apache.log4j.PatternLayout log4j.appender.YICHU.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}][%p][%c]%m%n

    7.指定配置文件

    若不指定,则默认找classpath下的log4j.properties或log4j.xml。 在spring-web项目中,可用下面的配置。注意log4j初试在context前。 <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:service.xml</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

    8. slf4j

    获取

    <!--以与log4j搭配为例--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency>

    slf4j,Simple Logging Facade for Java,用于java的简单日志门面系统。它不是具体的日志记录工具,类似于jdbc,提供了日志记录的统一接口。 使用哪种工具实现日志记录,不需要代码指定,只要将与你打算使用的日志系统对应的jar包加入到项目中,SLF4J就会自动选择使用你加入的那种日志系统。 slf4j中,使用下行语句得到logger: Logger org.slf4j.LoggerFactory.getLogger(Class clazz)

    相关资源:【ediary很好用的日志记录以及工作记录工具】
    最新回复(0)