谈到我们在Java程序中经常用的日志,Log4j应该是耳熟能详了。这里先提下slf4j,英文全名是Simple Logging Facade for Java,直面意思是:Java的简单日志门面。slf4j-api.jar,从这个名称的字面意思可以看出,就是为日志工具提供嵌入程序的接口;而slf4j-log4j12.jar可以理解成就是日志底层接口的实现,类似于中间件,一边对应底层的接口,一边可以根据偏好接入不同的日志系统。log4j.jar就是我们说的日志系统了,当然java有很多开源的日志系统,感兴趣的可以查一查,这里只说Log4j。

第一步:引入依赖

    打开pom文件,在dependencies里添加下面这部分代码

  1. <!-- ============== log begin ============== -->
  2. <dependency>
  3. <groupId>org.slf4j</groupId>
  4. <artifactId>slf4j-log4j12</artifactId>
  5. <version>1.7.25</version>
  6. </dependency>
  7. <!-- ============== log end ============== -->

然后更新项目,同时会引入如下三个有依赖关系的jar包

   

每个jar包的大致用途,上边已经讲了,接下来看看如何使用Log4j。

第二步:如何使用Log4j

    Log4j本身支持两种文件的配置方式,一种是XML文件,一种是properties文件,这里我们只说properties的方式,先创建一个log4j.properties的文件,写入配置信息

  1. ### set log levels ###
  2. log4j.rootLogger = INFO, console, debugFile, errorFile
  3. ### 输出到控制台 ###
  4. log4j.appender.console = org.apache.log4j.ConsoleAppender
  5. ##这个不指定默认是System.out,指定输出控制台
  6. log4j.appender.console.Target = System.out
  7. ##输出INFO级别以上的日志
  8. log4j.appender.console.Threshold = INFO
  9. ##布局模式,自己灵活指定
  10. log4j.appender.console.layout = org.apache.log4j.PatternLayout
  11. log4j.appender.console.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n
  12. ### 保存日志内容到具体文件 ###
  13. ##输出到每天一个独立文件
  14. log4j.appender.debugFile = org.apache.log4j.DailyRollingFileAppender
  15. ##输出DEBUG级别以上的日志
  16. log4j.appender.debugFile.Threshold = DEBUG
  17. ##异常日志文件路径,文件名称方案
  18. log4j.appender.debugFile.File = D:/logs/log.log
  19. log4j.appender.debugFile.DatePattern = '.'yyyy-MM-dd-HH
  20. ##设定信息是增加而不是覆盖
  21. log4j.appender.debugFile.Append=true
  22. #信息输出格式
  23. log4j.appender.debugFile.layout = org.apache.log4j.PatternLayout
  24. log4j.appender.debugFile.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n
  25. ### 保存异常信息到具体文件 ###
  26. ##输出到每天一个独立文件
  27. log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender
  28. ##只输出ERROR级别以上的日志内容
  29. log4j.appender.errorFile.Threshold = ERROR
  30. ##异常日志文件路径,文件名称方案
  31. log4j.appender.errorFile.File = D:/logs/error.log
  32. log4j.appender.errorFile.DatePattern = '.'yyyy-MM-dd-HH
  33. ##设定信息是增加而不是覆盖
  34. log4j.appender.errorFile.Append=true
  35. #信息输出格式
  36. log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout
  37. log4j.appender.errorFile.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n

对于上边的代码,这里讲下Log4j简单的使用重点

1.配置根Logger

  1. og4j.rootLogger = [ level ] , console, debugFile, errorFile

level指的是日志记录的优先级,分为ALL、DEBUG、INFO、WARN、ERROR等或者自定义的级别,这个决定日志信息展示的信息颗粒密度和重要等级,如果后边没有做具体设置,这个将起到作用。console,
debugFile等是设定日志信息输出策略的名字。

2.配置日志信息输出目的

  1. log4j.appender.console = org.apache.log4j.ConsoleAppender

这个参数是用来配置日志信息输出在哪里,常用的有这几个

  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(将日志信息以流格式发送到任意指定的地方)

当然也可以通过邮件、连接数据库等方式进行输出,也可以进行自己定义,具体可以查下相关资料。

3.配置日志信息的布局

  1. log4j.appender.console.layout = org.apache.log4j.PatternLayout

这个参数是用来设置采取什么布局样式,常用的有以下几种

  1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  2. org.apache.log4j.PatternLayout(可以自己指定布局模式)
  3. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  4. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

我们一般都是采用PatternLayout的格式来自己定义日志信息格式。

4.输出格式设置

  1. log4j.appender.console.layout.ConversionPattern = [framework][%d{ABSOLUTE}-%l][%p]:%m %n

这个类似于C语言的格式化打印的脚本信息,常用的几个如下

  1. %m   输出代码中指定的消息(这个就是我们在代码中定义要打出的那部分)
  2. %n   输出一个回车换行符(Windows平台为“\r\n”,Unix平台为“\n”)
  3. %p   输出优先级(即DEBUG,INFO,WARN,ERROR,FATAL)
  4. %r   输出自应用启动到输出该log信息耗费的毫秒数
  5. %c   输出所属的类目,通常就是所在类的全名
  6. %t   输出产生该日志事件的线程名
  7. %d   输出日志时间点的日期或时间(默认格式为ISO8601,也可以指定格式,如:%d{yyy MMM dd HH:mm:ss , SSS},或者直接%d{ABSOLUTE})
  8. %l   输出日志事件的发生位置,包括类目名以及在代码中的行数。(如:test.demo.controller.TestSpringController.getUser(TestSpringController.java:40))

类似不同的还有很多,就不一一列述。

    此外,还有要注意的是Appender选项的Threshold设定,是用来配置当前策略日志消息的输出最低层次的,还有一些选项,可以过后查查相关资料。

    日志的配置信息搞定了之后,我们接下来就在程序里添加几行代码,如下

  1. package test.demo.controller;
  2. import javax.annotation.Resource;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.ResponseBody;
  10. import test.demo.dao.UserDAO;
  11. import test.demo.data.User;
  12. @Controller
  13. public class TestSpringController {
  14. private static final Logger logger = LoggerFactory.getLogger(TestSpringController.class);
  15. @Resource
  16. private UserDAO userDao;
  17. @ResponseBody
  18. @RequestMapping(value="/getUser/{userId}", method=RequestMethod.GET)
  19. public String  getUser(@PathVariable Integer userId) {
  20. User user = userDao.getUserById(userId);
  21. logger.info("这个用户的名字是:{},年龄是{}" , user.getName(), user.getAge());
  22. logger.error("这个只是个测试:{}" , user.getName());
  23. return user.getName() + " , Hello Controller!";
  24. }
  25. }

我们为了突出效果,此处只留了我们所需的代码,OK,清理构建,打包部署,然后看看运行结果怎么样。

第三步:运行结果

    服务器启动之后,我们可以看到,日志系统开始工作了,部分截图如下

   

接着我们在浏览器输入:http://localhost:8080/demo/getUser/1、http://localhost:8080/demo/getUser/2,回车然后就可以在控制台看到以下内容

  1. [framework][17:04:28,801-com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:785)][INFO]:{dataSource-1} inited
  2. [framework][17:04:28,972-test.demo.controller.TestSpringController.getUser(TestSpringController.java:27)][INFO]:这个用户的名字是:tom,年龄是2
  3. [framework][17:04:28,972-test.demo.controller.TestSpringController.getUser(TestSpringController.java:28)][ERROR]:这个只是个测试:tom
  4. [framework][17:04:44,446-test.demo.controller.TestSpringController.getUser(TestSpringController.java:27)][INFO]:这个用户的名字是:jerry,年龄是1
  5. [framework][17:04:44,446-test.demo.controller.TestSpringController.getUser(TestSpringController.java:28)][ERROR]:这个只是个测试:jerry

然后去D盘下的logs文件夹下,可看到这两个日志文件已经生成

   

好了,到此为止,我们已经成功的在系统中添加了日志功能。

javaweb项目添加log4j日志的更多相关文章

  1. 类中添加log4j日志

    在编写代码的时候需要随时查看工作日志,查看工作日志的好处就是随时能检查出错误.所以我一般就需要在编写代码的前期添加工作日志,以便更好的查看相关错误输出. 以一个springmvc小demo为例子  主 ...

  2. Spring项目配置log4j日志功能

    一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包如使用maven,可以添加如下依赖 <!-- https://mvnre ...

  3. java项目添加log4j打印日志+转换系统时间

    1.pom.xml文件引入依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <ar ...

  4. springboot添加log4j日志配置log4j.xml生成日志文件

    第一步:添加pom文件依赖 <!-- log4j --> <dependency> <groupId>org.springframework.boot</gr ...

  5. java传统web项目添加maven管理jar包,log4j无法正常输出日志

    本文适合1年以上编程基础的开发人员阅读,非技术创新,可作为故障排除实录参考/收藏. 背景 笔者最近在给公司一个老的web项目改造升级,项目使用springmvc+mybatis,由于项目比较久远,没有 ...

  6. log4j在javaWeb项目中的使用

    在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等 ...

  7. apache log4j日志工具使用入门[maven 项目配置]

    简单的介绍下Maven项目中有关org.apache.log4j.Logger的使用.[1]首先我们需要找到 org.apache.log4j.Logger的坐标,并配置到POM.xml <de ...

  8. web项目中添加logger日志

    在项目中添加log4j.xml文件 log4j.xml文件 <?xml version="1.0" encoding="UTF-8" ?><! ...

  9. log4j日志输出到web项目指定文件夹

    感谢 eric2500 的这篇文章:http://www.cxyclub.cn/n/27860/ 摘要:尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终在eric2500的指导 ...

随机推荐

  1. cPickle对python对象进行序列化,序列化到文件或内存

    pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别.要和其他语言交互,可以使用内置的json包 cPickle可以对任意一种类型的python对象进 ...

  2. Mac OSX原生读写NTFS功能开启方法

    macOX系统内建的NTFS支持默认只能读不能写 原生读写NTFS,需要自行终端命令手动开启 1. 插上磁盘 此时Mac桌面应该会显示出插入的磁盘,但是当你想把文件拖入磁盘的时候,发现是不能拖进去的, ...

  3. Java8 Date与LocalDate互转

    Java8 日期时间API,新增了LocalDate.LocalDateTime.LocalTime等线程安全类,接下来要说的是LocalDate与java.util.Date之间的转换. 1.Loc ...

  4. CNN网络改善的方法——池化

    一个能降低卷积金字塔中特征图的空间维度,目前为止,我们通过调整步幅,将滤镜每次移动几个像素.图1 从而降低特征图的尺寸.这是降低图像采样率的一种非常有效的方法. 图1 它移除了很多信息,如果我们不采用 ...

  5. 从遇见到信任 | Apache Dubbo 的毕业之旅

    所谓信任,就是多一次机会. 2018年2月16日,Apache Dubbo 加入 Apache 基金会孵化器. ... 2019年5月16日,Apache 软件基金会董事会决议通过了 Apache D ...

  6. LOJ 10239 有趣的数列

    LOJ 10239 有趣的数列 首先可以将奇数视作入栈,偶数视作出栈,那么它是卡特兰数,其实打表也能看出来,而且好像可以用dp? 不过这道题的难点不在这里,p不是素数,所以不能用求逆元来做,不过前50 ...

  7. Scrapy五大核心组件简介

    五大核心组件 scrapy框架主要由五大组件组成,他们分别是调度器(Scheduler),下载器(Downloader),爬虫(Spider),和实体管道(Item Pipeline),Scrapy引 ...

  8. oralce 分离表和索引

    总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上.   “同时 ...

  9. Python xrange() 函数

    描述 xrange() 函数用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器. 语法 xrange 语法: xrange(stop) xrange(start, stop[, ...

  10. 使用java实现CNN的实战

    使用java实现CNN的实战 1.要实现CNN,其中包括 卷积.池化(下采样).分类器.优化方法.分类器.反向传播 2.可以使用一个三维数组来表示一张图片(通道.行.列) 3.卷积,卷积的方式有三种: ...