java日志框架总结(三 、Log4j日志框架)_javalog4j-程序员宅基地

技术标签: python  java  java日志框架总结  log4j  

一、简介

        Log4j ( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache 的一个开源项目, 为Java提供了日志记录功能。能够让程序员非常方便的记录日志, 并且提供了多种适配方式,能满足各种需求。

使用Log4j 只需要导入一个jar包,jar 下载地址。 Maven 坐标为:


<dependency>
    <groupId>org.log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.9</version>
</dependency>

二、Log4j 组成

Log4j 有三个主要组件——loggers、appender 和 layouts ——它们可以一起使用,以在所需的目的地打印自定义的日志语句。其中对应着下面三个部分:

  • Level : 日志等级, 用于定义日志的重要程度
  • Appender: 追加器, 用于定义日志的输出位置
  • Layout: 布局, 用于定义日志的输出格式
1)Logger

Logger 对象负责展现日志记录信息。它是 Log4j 架构中的第一个必须层。Logger 类在包 org.apache.log4j 中定义。

通常,我们为每个应用类创建一个 Logger 实例来记录属于该类的重要事件。此外,我们通常使用接受类名作为参数的静态工厂方法在类的开头创建此实例:(与JUL类似)

private static final Logger logger = Logger.getLogger(JavaClass.class.getName());

 Log4j 日志等级有:

  • off: 关闭日志 , 最高等级, 任何日志都无法输出
  • fatal,: 灾难性错误, 在能够输出日志的所有等级中最高
  • error:错误, 一般用于异常信息
  • warn:警告, 一般用于不规范的引用等信息
  • info: 普通信息
  • debug: 调试信息, 一般用于程序执行过程
  • trace: 堆栈信息, 一般不使用
  • all: 打开所有日志, 最低等级, 所有日志都可使用

在 Logger 核心类中, 除了 off/all 以外, 其他每个日志等级都对应一组重载的方法, 用于记录不同等级的日志

当且仅当 方法对应的日志等级 大于等于 设置的日志等级时, 日志才会被记录

2)Appender(追加器) 

Appender 用于定义日志的输出位置, Log4j 提供了多种可供选择的追加器。常用追加器有

Appender的作用:
ConsoleAppender:将日志记录在控制台
FileAppender:将日志记录在文件中
RollingFileAppender:将日志记录在文件中, 当文件达到一定大小之后,会创建新文件
DailyRollingFileAppender:将日志记录在文件中, 每天一个备份文件
JDBCAppender:将日志记录在数据库表中

以上五个为常用Appender,完整列表为

当然, 如果觉得这些也不能满足你的需求, 你可以:

  • 实现 Appender接口 implements Appender
  • 继承 AppenderSkeleton类 重写核心方法
3)Layout (布局)

Layout 用于定义输出日志的格式, 常用Layout 有

Layout的格式 
SimpleLayout:简单格式, 格式为 日志等级 - 日志内容 
TTCCLayout :Time,Thread,Category,Context [线程] 日志等级 记录日志的类的包名.类名 - 日志内容
XMLLayout:以XML格式输出日志
HTMLLayout :以HTML文件格式输出日志
PatternLayout :灵活格式输出日志, 使用通配符自定义格式 

以上五个为常用Layout ,完整列表为

三、Log4j 应用

        1)简单demo
    public static void main(String[] args) throws IOException {
        
        // 获取日志记录器对象
        Logger logger = Logger.getLogger(logDemo.class.getName());
        
        // 日志记录输出
        logger.info("hello log4j");
        // 日志级别
        logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃和终止运行
        logger.error("error"); // 错误信息,但不会影响系统运行
        logger.warn("warn"); // 警告信息,可能会发生问题
        logger.info("info"); // 程序运行信息,数据库的连接、网络、IO操作等
        logger.debug("debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
        logger.trace("trace"); // 追踪信息,记录程序的所有流程信息
        
    }

与JUL不同的是,JUL的logger对通过getLogger获取之后,可以直接默认输出日志,因为其默认继承RootLogger,但是Log4j不同,获取之后直接输出会报错,如下所示:

出现这个的原因是因为我们没有正确的初始化Log4j,需要添加一行初始化配置的代码:

 // 初始化系统配置
        BasicConfigurator.configure();

完整如下:

    public static void main(String[] args) throws IOException {

        // 初始化系统配置
        BasicConfigurator.configure();
        // 获取日志记录器对象
        Logger logger = Logger.getLogger(logDemo.class.getName());

        // 日志记录输出
        logger.info("hello log4j");
        // 日志级别
        logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃和终止运行
        logger.error("error"); // 错误信息,但不会影响系统运行
        logger.warn("warn"); // 警告信息,可能会发生问题
        logger.info("info"); // 程序运行信息,数据库的连接、网络、IO操作等
        logger.debug("debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
        logger.trace("trace"); // 追踪信息,记录程序的所有流程信息
        
    }

 

 这样就可以正常输出了。

2)简单使用配置文件

        
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 appender 为=console
log4j.rootLogger=trace,console
# 指定控制台日志输出的 appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

 去掉刚才的配置代码:

 日志输出:

3)常用配置文件

        1.输出到控制台配置:

# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=all,使用的 appender 为=console
log4j.rootLogger=all,console

#################
# 输出到控制台
#################
#console 控制台输出源
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 输出日志的格式(布局)实现类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 输出日志的具体格式
log4j.appender.console.layout.conversionPattern=%d [%t] %-5p [%c\:%L] %m%n
# 输出日志的级别 不填则继承root的级别
log4j.appender.console.threshold=info

  其实配置比较简单,需要着重说明一下的就是layout的输出格式,具体字符含义如下所示:

模式参数说明
%c: 输出日志的logger名, 即Logger.getLogger中的名字或全限定类名
%C: 输出日志消息产生时所在类的全限定类名
%d: 输出日志的时间格式, 默认格式为ISO8601(yyyy-MM-dd HH:mm:ss,SSS). 可在后面指定格式, 例如: %d{yyyy-MM-dd HH:mm:ss}
%F: 输出日志消息产生时所在的类文件名 (示例: LogTest.java)
%l: 输出日志的详细位置. 相当于%c.%M(%F:%L的组合),  示例: com.chenlongji.log4jstudy.controller.LogTest.testRolling(LogTest.java:24)
%L: 输出日志时所在的行数
%m: 输出日志的具体内容
%M: 输出日志所在类的方法名 (示例: testRolling)
%n: 输出当前系统的换行符
%p: 输出日志的级别
%r: 输出自日志程序启动到输出当前日志的耗时数. 没啥意义
%t: 输出日志产生的线程名
%x: 输出和当前线程相关联的NDC(嵌套诊断环境), 只能存储一个值
%X: 输出映射调试上下文信息, (使用map, 可以存储多个值). 常用于将traceId传递到日志中, 进行日志上下文搜索. 使用示例:  tid=%X{traceId}, 花括号内表示要取出值的key
使用说明: 使用MDC跟踪日志_mdc日志_livel_java的博客-程序员宅基地
%%: 输出一个%号
[num]: 阿拉伯数字, 表示输出的长度
示例 %5p, 表示输出日志级别, 占位为5, 多余长度补空格, 默认是右对齐
-[num]: 左对齐, 实际长度不足补空格, 实际长度超出也全显示
.[num]: 实际长度大于num会截掉左侧部分

所需的按照上面字符的配置即可。

        2.输出到文件:

# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=all,使用的 appender 为=console
log4j.rootLogger=all,logDailyFile,console

#################
# 输出到控制台
#################
#console 控制台输出源
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 输出日志的格式(布局)实现类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 输出日志的具体格式
log4j.appender.console.layout.conversionPattern=[%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 输出日志的级别 不填则继承root的级别
log4j.appender.console.threshold=info



#################
# 输出到文件(RollingFileAppender类型)
#################
# 滚动文件输出源, 文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.logDailyFile=org.apache.log4j.RollingFileAppender
# 输出文件的路径 例如:./src/logs/clj2023.log
log4j.appender.logDailyFile.file=D://logs/info.log
# 文件最大容量(到达后创建新的文件), 默认值为10MB. 这里后缀可以为KB,MB,GB
log4j.appender.logDailyFile.maxFileSize=500MB
# 输出日志的格式(布局)实现类. 注: layout必须是小写
log4j.appender.logDailyFile.layout=org.apache.log4j.PatternLayout
# 输出日志的具体格式
log4j.appender.logDailyFile.layout.conversionPattern=%d [%t] %-5p [%c\:%L] %m%n
# 输出日志的级别 不填则理解为ALL级别
log4j.appender.logDailyFile.threshold=info

输出到文件的类型可选,按需即可。

以上就是常用的配置!具体配置细节可以在细查。

输出到数据库用的不多就省略了,需要可以自再查。

4)自定义Logger
# 自定义 logger 对象设置
log4j.logger.com.log.demo=info,file
# 日志文件输出的 appender 对象
log4j.appender.file=org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern=[%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file=c:/logs/log4j.log

自定义logger的是类路劲,如果某个单独的类需要自定义logger,就把自定义路径配置上去就行。

log4j应用场景已经没有太多了,所以就不过多描述,需要的话可以看下下面的详细讲解!

log4j配置详解_log4j配置文件-程序员宅基地

Java日志框架 -- LOG4J(Log4j入门案例、日志级别、Log4j组件(Loggers、Appenders、Layouts)、配置文件、内置日志记录、自定义Logger)_java log4j-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kkkkatoq/article/details/135902167

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签