谈到我们在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. GIT 公钥配置

    1.下载git 2.ssh-keygen -t rsa -C "xxx@xxx.com" 3.cd ~/.ssh 4.ls 5.cat id_rsa.pub 或者C:\User\x ...

  2. 文字渐变效果:图层中的mask属性

    http://www.cocoachina.com/ios/20150716/12571.html 前言 已经很久没写blog了,最近发生了太多事情,失去了生命中一位很重要的成员,使我不得不放下对技术 ...

  3. @hdu - 5960@ Subsequence

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定如下计算序列权值的函数: 对于一个由三元组 (cost0, ...

  4. python 检测文件夹的数据变动

    from watchdog.observers import Observerfrom watchdog.events import *import time class FileEventHandl ...

  5. uva 11806 Cheerleaders (容斥)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  6. 用laravel搭一个微信公众号后台

    我使用的是laravel5.2, 早期版本可能不适合下面的方法. 在routes.php写下接收微信服务器post请求的路径: Route::post('wechatmp', 'WechatContr ...

  7. poj 2442 Sequence (Priority Queue)

    2442 -- Sequence 真郁闷,明明方法是对的,为什么我的代码老是那么的慢._(:з」∠)_ 这题要想考虑两列的情况,然后逐列拓展. 代码如下: #include <cstdio> ...

  8. Levenshtein distance 编辑距离算法

    这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算 ...

  9. Educational Codeforces Round 7、

    A - Infinite Sequence 题意:有一种这样的无限序列数 1,1,2,1,2,3.....   (如果最大数n,那么就有从1到n的所有1到n的数): 思路:题意只给了1秒.直接模拟肯定 ...

  10. Yarn install 报错 Resolving packages... [2/4] Fetching packages... info There appears to be trouble with your network connection. Retrying

    1.设置淘宝代理 yarn config set registry 'https://registry.npm.taobao.org' 2.如果网址本地可以打开,说明你本地有代理设置 所以需要按本地的 ...