黑马程序员技术交流社区

标题: 【广州校区】+【原创】Log4j的良好格式规范和常见问题 [打印本页]

作者: ley    时间: 2017-12-21 14:00
标题: 【广州校区】+【原创】Log4j的良好格式规范和常见问题
本帖最后由 ley 于 2017-12-21 15:08 编辑

当程序部署在生产线上之后,出现问题需要记录。这时候日志记录就显得尤其重要了。
但是对于日志输出的良好格式,对于运维人员来说尤其重要。这里定义三个地方输出,
第一个是stdout是指在控制台输出。
第二个是指定绝对路径(当然最正常的应该是取相对路径),存放debug信息。
第三个是指定路劲存放error信息。
Debug和error分开,有助于排查错误方便,又不影响debug信息的保存。

以下步奏:
a.引用所需要的jar包。
<!-- 日志 -->
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
</dependency>
b.log4j的配置信息
log4j.rootLogger=debug,stdout,DDD,EEElog4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=WARN
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyy-M-dd HH:mm:ss } [class: %c  className:%F %n  method:%l %n threadName: %t ] %n
log4j.appender.EEE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.EEE.File=D:/log4j/log4j-error.log
log4j.appender.EEE.Append=true
log4j.appender.EEE.Encoding=UTF-8
log4j.appender.EEE.Threshold=ERROR
log4j.appender.EEE.layout=org.apache.log4j.PatternLayout
#log4j.appender.EEE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.EEE.layout.ConversionPattern=%d{yyy-M-dd HH:mm:ss } [class: %c  className:%F %n  method:%l %n threadName: %t ] %n
log4j.appender.DDD=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DDD.File=D:/log4j/log4j-debug.log
log4j.appender.DDD.Encoding=UTF-8
log4j.appender.DDD.Append=true
log4j.appender.DDD.Threshold=DEBUG
log4j.appender.DDD.layout=org.apache.log4j.PatternLayout
#log4j.appender.DDD.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.DDD.layout.ConversionPattern=%d{yyy-M-dd HH:mm:ss } [class: %c  className:%F %n  method:%l %n threadName: %t ] %n

c.代码编写
private static final Logger LOGGER = LoggerFactory.getLogger(ItemController.class);
/** 注入服务层接口的代理对象 */
@Autowired
private ItemService itemService;
/** 分页查询商品 */
@GetMapping
public DataGridResult selectItemByPage(Item item,
      @RequestParam("page")Integer page,
      @RequestParam("rows")Integer rows){

   LOGGER.debug("保存商品,接收参数 商品详情:{}, 商品详情描述:{}", item, rows);

   try{
      int i=1/0;
      if (item != null && StringUtils.isNoneBlank(item.getTitle())){
         item.setTitle(URLDecoder.decode(item.getTitle(), "utf-8"));
      }
      return itemService.selectItemByPage(item, page, rows);
   }catch(Exception ex){
      LOGGER.error("保存商品失败!",ex);
      throw new RuntimeException(ex);
   }
}
根据自身需要的信息定义相对应的参数。
log4j的ConversionPattern参数的意义
log4j.appender.stdout.layout.ConversionPattern在控制台输出内容,根据log4j定义的参数输出对应的参数。
常用标志:
-X: X信息输出时左对齐
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行

输出信息乱码问题,注意点:
a.需要工具编码和输出编码一致。

注意点:
如果你也是用idea需要指定编译工具的编码和日志文件指定的编码一致,才能够保证。正常显示正常编码。
1.本地项目配置
file-->settings-->File Encodings-->把看到的gbk改成utf-8 (因为帖子有长度限制,不能发图了)

输出信息不显示,注意点:
a.rootLogger里配置的level比如小于Threshold层级  否则无效 还是按照总的rootLogger里的level来输出,一般我们实际实用的话 rootLogger里配置DEBUG,然后某个文件专门存储ERRO日志,就配置下Threshold为ERROR.



作者: 帅气de路人甲    时间: 2017-12-29 09:47
已学习,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2