当前位置: 首页 > news >正文

Java日志组件2---Log4j(org.apache.log4j.Logger)

如果我们在项目中,需要记录的东西并不多,而且也不需要有太多区分,使用jdk的自带Log完全可以解决问题。但是,在开发的过程中,大多数项目都比较大,为方便找到程序的bug,都是需要系统的记录日志的。这里边出现了Log4j(Log for Java),Apache Log4j下载地址:log4j官方下载。

apache的log4j是一个开源项目,作为一个强大的日志组件,它提供的功能远比jdk系统再带的log要多,可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。

下面是本人测试log4j的过程

1、新建java项目:Logger

2、添加log4j-1.2.17.jar包

3、添加log4j.properties配置文件,这里在写的过程中发现,在写入properties文件的时候,会将中文字符转化为unicode码,所以我将log4j.properties更改为log4j.txt文件,然后在代码中手动加载log4j.txt文件(文件位置config/log4j.txt)

config/log4j.txt:

### 设置logger级别 ###
log4j.rootLogger = debug,stdout,D,E

### 输出格式解释:
### [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n

### %d{yyyy-MM-dd HH:mm:ss}: 时间,大括号内是时间格式
### %c: 全类名
### %M: 调用的方法名称
### %F:%L  类名:行号(在控制台可以追踪代码)
### %n: 换行
### %p: 日志级别,这里%-5p是指定的5个字符的日志名称,为的是格式整齐
### %m: 日志信息

### 输出的信息大概如下:
### [时间{时间格式}][信息所在的class.method(className:lineNumber)] 换行
### [Level: 5个字符的等级名称] - Msg: 输出信息 换行

### appender.stdout输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n

### appender.D输出Debug信息到日志文件 E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://Log//Log4j//log4j_debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n

### appender.D输出Error信息到日志文件 E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = E://Log//Log4j//log4j_error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}][Class: %c.%M(%F:%L)] %n[Level: %-5p] - Msg: %m%n

4、写测试类Log4jTest.java

package cn.darkranger.log.log4j;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.junit.Test;

public class Log4jTest {
    private static Logger logger = Logger.getLogger(Log4jTest.class);

    static {
        
        // **** 在JavaWeb中一般通过下面方式配置 ****
        //     <context-param>
        //         <param-name>log4jConfigLocation</param-name>
        //         <param-value>/WEB-INF/classes/log4j.properties</param-value>
        //     </context-param>
        //     <listener>
        //         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        //     </listener>
        
        // **** 在Java项目中 ****
        // 手动读取配置文件
        // 读取的文件应该是log4j.properties,由于在log4j.properties中中文会转化为Unicode码,将文件修改为log4j.txt
        
        PropertyConfigurator.configure("config/log4j.txt");
    }

    @Test
    public void test01() {
        // 等级从上到下依次下降
        // 灾难、严重
        logger.fatal("this is fatal!");
        // 错误
        logger.error("this is error!");
        // 警告
        logger.warn("this is warn!");
        // 信息
        logger.info("this is info!");
        // 调试
        logger.debug("this is debug!");
        // 追踪
        logger.trace("this is trace!");
    }
}

测试:

控制台输出:

[2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:32)] 
[Level: FATAL] - Msg: this is fatal!
[2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:34)] 
[Level: ERROR] - Msg: this is error!
[2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:36)] 
[Level: WARN ] - Msg: this is warn!
[2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:38)] 
[Level: INFO ] - Msg: this is info!
[2016-06-15 15:41:42][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:40)] 
[Level: DEBUG] - Msg: this is debug!

文件输出:

E:\Log\Log4j\log4j_debug.log

[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:32)] 
[Level: FATAL] - Msg: this is fatal!
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:34)] 
[Level: ERROR] - Msg: this is error!
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:36)] 
[Level: WARN ] - Msg: this is warn!
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:38)] 
[Level: INFO ] - Msg: this is info!
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:40)] 
[Level: DEBUG] - Msg: this is debug!

E:\Log\Log4j\log4j_error.log

[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:32)] 
[Level: FATAL] - Msg: this is fatal!
[2016-06-15 16:04:04][Class: cn.darkranger.log.log4j.Log4jTest.test01(Log4jTest.java:34)] 
[Level: ERROR] - Msg: this is error!

 

转载于:https://www.cnblogs.com/wrcold520/p/5587854.html

相关文章:

  • react项目搭建
  • mybatis3.0 配置等值连接两种方式:resultMap和resulttype
  • react官方脚手架安装
  • 怎么用ChemDraw 15.1 Pro绘制彩色结构
  • react实现打印功能
  • 关于CreateProcess函数一些经验
  • 前端解决跨域 cors
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 斐波那契数列 的计算规则
  • react 中 props 和 state的相同与不同
  • 理解java Web项目中的路径问题
  • react 中千万不要在render里调用this.setState
  • 系统界面图片
  • HDU 3068 回文串-Manacher
  • reactJS的props.children.map函数来遍历会收到异常提示,为什么?应该如何遍历?
  • 【技术性】Search知识
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CAP 一致性协议及应用解析
  • Druid 在有赞的实践
  • mysql外键的使用
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PermissionScope Swift4 兼容问题
  • rc-form之最单纯情况
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 工程优化暨babel升级小记
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 如何设计一个比特币钱包服务
  • 什么是Javascript函数节流?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #Spring-boot高级
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (补)B+树一些思想
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分布式缓存)Redis分片集群
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (算法)求1到1亿间的质数或素数
  • (转)视频码率,帧率和分辨率的联系与区别
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .htaccess配置重写url引擎
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Core中的去虚
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [C++]:for循环for(int num : nums)
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [git]git命令如何取消先前的配置