idea工具java日志 Log4j+slf4j使用

元气小坏坏 提交于 2020-03-01 03:33:24

参考博文:http://www.blogjava.net/zzzlyr/articles/353039.html

这几天一直在用logger记录日志,但一直不明白log4j.properties配置文件意思,下面看看其他博主文章给自己充充电。

本人认为日志记录不仅可以帮记录执行结果,看代码执行是否正常,并且在排查问题时也能很快帮助你定位有问题代码。

一、介绍
Log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

Log4j由三个重要的组件构成:

  • loggers: 负责捕获记录信息,日志信息的优先级

  • appenders : 负责发布日志信息,日志信息的输出目的地

  • layouts: 负责格式化不同风格的日志信息,日志信息的输出格式

从源码角度深入分析log4j配置文件使用:http://www.cnblogs.com/davidwang456/p/4243161.html


注意:

1、日记记录的优先级(低到高)

#  控制台显示的内容是:优先级大于等于log4j.properties中配置的信息。

# ALL< DEBUG < INFO < WARN < ERROR < FATAL < OFF.
# Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。
# ERROR 为严重错误 主要是程序的错误
# WARN 为一般警告,比如session丢失
# INFO 为一般要显示的信息,比如登录登出
# DEBUG 为程序的调试信息


2、Log4j配置简单示列:

第一步:maven 依slf4j包或手动引入如下jar包

1、slf4j-api-1.7.5.jar

2、slf4j-log4j12-1.7.5.jar

3、log4j-1.2.16.jar


第二步:在resource中配置log4j.properties(或者log4j.xml)配置文件

#配置根Logger
log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …
#配置日志信息输出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN
 
#配置日志信息的格式(布局)
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.optionN = valueN

    appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地

log4j.rootLogger=DEBUG,console,D,E

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n

# 输出DEBUG 级别以上的日志到
log4j.appender.D = org.apache.log4j.RollingFileAppender
log4j.appender.D.Threshold=DEBUG
# DEBUG 级别以上的日志输出目录
log4j.appender.D.File = C:/Users/admin/Desktop/debug.log
log4j.appender.D.Append = true
log4j.appender.D.MaxFileSize=5MB
log4j.appender.D.layout= org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n

# 输出ERROR 级别以上的日志到
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.Threshold=ERROR
log4j.appender.E.File = C:/Users/admin/Desktop/error.log
log4j.appender.E.Append = true
log4j.appender.E.MaxFileSize=5MB
log4j.appender.E.layout= org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n


注意:Log4j的配置

由于WebApplicationContext需要使用日志功能,用户可以将log4j.properties放置在类路径下,这样就会自动启动。如果放在其他地方,必须在web.xml中指定Log4j配置文件的位置。Spring为启动Log4j引擎提供了两个类og4jConfigServlet和Log4jConfigListener,不管哪种方式都必须保证能够在装载Spring配置文件前先装载Log4J配置信息。

<context-param>  
    <param-name>log4jConfigLocation</param-name>  
    <param-value>/WEB-INF/log4j.properties</param-value>    
  </context-param>  
  <servlet>  
    <servlet-name>log4jConfigServlet</servlet-name>  
    <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>  
    <load-on-startup>1</load-on-startup>  
  </servlet>


第三步:使用日志,在controller层使用日志

@Controller
@RequestMapping(value = "/api/controller/brand")
public class BrandController {
 
    private static Logger logger = LoggerFactory.getLogger(BrandController.class);
    @Autowired
    private BrandService brandService;
 
    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public Brand update(Model model){
        Brand brand = brandService.findByBrandCode("1a9e2fb7-d8d3-4dce-a50b-52c77efb2629");
        brandService.update(brand);
        //SLF4J的日志消息使用占位符"{}"代替了常用的字符串拼接,据官方说这样速度更快
        logger.info("{}更新成功",brand.getId());
        logger.error("更新失败");
        logger.debug("debug功能");
        return brand;
    }



3、知识点:

log4j.rootLogger=info,stdout, R 定义 logger记录大于等于info优先级日志信息,stdout表示在控制台显示,R表示日志记录在文件中。

stdout:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender  意思是把日志输出到控制台

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   意思是日志在控制台显示布局模式

log4j.appender.stdout.layout.ConversionPattern=%d{HH\:mm\:ss} %c{1} - %m%n 表示日志输出的格式,%d{HH\:mm\:ss} %c{1} - %m%n表示时:分:秒 类名 日志信息 换行

R:

log4j.appender.R=org.apache.log4j.RollingFileAppender  :日志文件大小到达指定尺寸的时候产生一个新的文件

log4j.appender.R.File=mat.log 表示是放日志文件的路径

log4j.appender.R.MaxFileSize=5MB   表示指定日志文件大小

log4j.appender.R.layout=org.apache.log4j.PatternLayout  日志记录的布局模式

log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n 表示日志输出格式

年-月-日 时:分:秒 类名 优先级显示日志信息 换行


#appender名字定义

#appender名字定义
log4j.rootLogger=INFO,FILE,consoleAppender,RollingFile,MAIL,DailyRollingFile,DATABASE
log4j.addivity.org.apache=true

#配置日志信息输出目的地
#log4j.appender.appenderName = fully.qualified.name.of.appender.class
#(如:log4j.appender.RollingFile = org.apache.log4j.RollingFileAppender)
# 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(将日志信息以流格式发送到任意指定的地方)

#配置日志信息的格式
#log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
#(如:log4j.appender.RollingFile.layout = org.apache.log4j.HTMLLayout)
# 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
# 2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
# 3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
# 4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


#输出格式:layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):

# %c 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName)
# %d 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
# %l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
# %n 换行符
# %m 输出代码指定信息,如info(“message”),输出message
# %p 输出优先级,即 FATAL ,ERROR 等
# %r 输出从启动到显示该log信息所耗费的毫秒数
# %t 输出产生该日志事件的线程名


#ConsoleAppender,控制台输出
#FileAppender,文件日志输出
#SMTPAppender,发邮件输出日志
#SocketAppender,Socket日志
#NTEventLogAppender,Window NT日志
#SyslogAppender,
#JMSAppender,
#AsyncAppender,
#NullAppender

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!