Java中 log4j日志级别配置详解

1.1 前言

  说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis、rabbitMQ、SSM框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙X了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就OK了。我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到......

1.2 闲话少说,讲讲日志的发展故事(如果已经了解的可以跳过,直接看1.3日志配置)

  要想对日志技术实现深入了解,我个人建议去看:logback + slf4j。至于日志配置,还是了解log4j比较好,因为目前绝大部分的项目还是使用log4j的。好了,下面开始讲讲日志的发展故事:

  1999年,Apache开源社区发布了log4j,一时轰动整个程序界,从此成为日志的标准并广泛为java程序员所使用。随后Sun公司也在JDK1.4版本时发布了Logging机制(java.util.logging,以下简称JUL),但是该机制并未获得公众的认可,真是可怜。不久Apache又推出了commons-logging日志框架(能够让开发者抽象日志实现方式而不必关注具体使用哪个日志技术,通俗地说就是你要用手机叫滴滴,如果你是在北京你就会叫来北京的滴滴,在香港你就会叫来香港的滴滴),该框架仿佛是对Sun公司的鄙睨,其可以自动查找调用当前环境下的日志技术进行日志输出,该日志框架可支持log4j或JUL。commons-logging+log4j在其后的很长一段时间内成为了Java日志的经典组合。然而之后commons-logging有一段时间没更新了,不知道是不是commons-logging当初的设计不够好,想再优化也比较多困难,为什么这么说呢?因为接下来一个优秀的日志框架slf4j诞生了,该作者(Ceki Gülcü)就是log4j的作者之一,他的slf4j设计上更优雅,并且他还实现了logback技术,也是比log4j更前沿。至此,日志体系由commons-logging+log4j一家独大的局面开始受到动摇,各种commons-logging+log4j?slf4j+log4j?slf4j+logback?搭配,真是让人揪心。更恐怖的是,Ceki Gülcü大佬又帮忙优化了log4j,从此世界又多了一项日志技术--log4j2。这是要学腾讯搞微信和QQ吗,真是666。因此,如果大家想对日志技术深入了解的话,可以去找找logback + slf4j的相关资料。至于配置文件,我认为你就了解下我下面写的log4j配置详解就好了,毕竟现在还是比较多公司用log4j框架的。

1.3 进入正题,log4j日志基本配置

1.在项目的classpath下或者resource包下(maven项目)新建一个log4j.properties文件,初始项目配置如下参数就足够了,更详细配置可继

续看1.4 log4j日志级别配置;

#通过根日志记录器指定日志级别及输出源
#日志输出的优先级: debug < info < warn < error < fatal
#定义根日志记录器的日志级别(info)及输出源的别名(console,myFile)
#该定义让日志在控制台和文件输出,并且只输出info级别以上的日志
log4j.rootLogger=info,console,myFile
#######配置输出源console的具体实现为控制台输出#######
#定义输出源别名console(即根日志记录器定义的输出源)
#的实现类是ConsoleAppender(控制台输出源)log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定日志输出格式的格式转换器为PatternLayout实现类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#定义日志输出的具体格式
log4j.appender.console.layout.ConversionPattern=%d %-5p [%c.%M()] - %m%n
#######配置输出源myFile的具体实现为文件输出#######
#定义输出源别名myFile(即根日志记录器定义的输出源)
#的实现类是RollingFileAppender(文件输出源)log4j.appender.myFile=org.apache.log4j.RollingFileAppender
#定义日志文件的存储路径
log4j.appender.myFile.File=src/log/logProperties/log4j.log
#定义日志文件的大小
log4j.appender.myFile.MaxFileSize=1024kb
#定义日志文件最多生成几个(从0开始算1个,即此处最多3个文件)
#超过该大小则会覆盖前面生成的文件
log4j.appender.myFile.MaxBackupIndex=2
#指定日志输出格式的格式转换器为PatternLayout实现类
log4j.appender.myFile.layout=org.apache.log4j.PatternLayout
#定义日志输出的具体格式
log4j.appender.console.layout.ConversionPattern=%d %-5p [%c.%M()] - %m%n
#######输出格式解释#######
#%d: 日志打印的时间点,默认格式为ISO8601,也可以另外指定格式,
     #定义如下: %d{yyy年MM月dd日 HH时mm分ss秒SSS},则会输出:
     #2018年01月06日 14时47分45秒590
#%p: 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL
     #%-5p:表示字符小于5位,则字符居左(不加“-”号则字符居右),你可以举一反三
#%c: 日志所在类的全名
#%M: 日志所在方法的名字
#%m: 日志信息
#%n: 输出一个回车换行符
#%L: 输出代码中的行号

2.调用日志测试配置结果。

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class LogPropertiesTest {
  public static void main(String[] args) {
    /*解析非classpath下的配置文件
    String log4jPath=System.getProperty("user.dir")+"\\src\\log\\logProperties\\log4j.properties";
    PropertyConfigurator.configure(log4jPath);*/
    Logger log = LogManager.getLogger(LogPropertiesTest.class);
    log.debug("调试");
    log.info("信息");
    log.warn("警告");
    log.error("错误");
    log.fatal("致命错误");
  }
}

1.4日志级别配置

  日志级别配置可分为3类,一类如上配置是配置父类日志记录器的日志级别,第二类是配置子类日志记录器的日志级别,第三类是配置输出源(控制台、文件等)的日志级别。他们的日志级别解析优先级由低到高排列。具体表述原谅我说不清楚,直接
上案例,大家应该能够懂!

1.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),没有配置子类日志记录器的日志级别,也没有配置输出源的日志级别,则输出源只能输出INFO级别以上的;

2.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),配置了子类日志记录器的日志级别(假设是DEBUG级别),没有配置输出源的日志级别,则输出源输出DEBUG级别以上的;

3.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),配置了子类日志记录器的日志级别(假设是DEBUG级别),配置了输出源的日志级别(假设是INFO级别),则输出源输出INFO级别以上的;

4.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),没有配置子类日志记录器的日志级别,配置

了输出源的日志级别(假设是DEBUG级别),则输出源输出INFO级别以上的;

因此,从上述的案例中我们可以知道日志记录器和输出源输出日志级别存在2个逻辑关系:

1.输出源如果没有定义日志级别,它会继承最接近它的子类日志记录器的日志级别;子类日志记录器没有定义日志级别,它会继承最接近它的父类日志记录器。

2.打印日志时输出源会根据自身定义的日志级别与最接近它的子类日志记录器定义的日志级别比较,如果输出源定义的级别高于子类日志记录器,则按输出源定义的日志级别输出日志,反之则按子类日志记录器的日志级别输出。

所以在项目中可以按日下配置方式配置日志级别:

#控制父类日志记录器的日志级别为info,默认所有模块下只输出info级别以上的日志
log4j.rootLogger=info,console
#单独控制某个模块下的日志级别为error,只有发生异常的时候才输出日志
log4j.logger.log.logProperties=error
#单独控制某个类的日志级别debug,方便输出调试信息
log4j.logger.log.logProperties.LogPropertiesTest=debug
############# 日志输出到控制台 #############
#日志输出到控制台使用的api类
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定当前输出源的日志级别,有了前面的配置,就不需要配置该项了
#log4j.appender.console.Threshold = info
#指定日志输出的格式:灵活的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#具体格式的内容
log4j.appender.console.layout.ConversionPattern=%d %-2p [%c.%M()] - %m%n 

1.5结束语

  到此,相信你日志配置有了基本的掌握了。文中有很多地方可能会有不对的地方,欢迎各位大侠指出。我也是为了能够深刻理解该技术的配置,才撰文总结,这样我就会对它有更深层次的理解了。

(0)

相关推荐

  • Log4j定时打印日志及添加模块名配置的Java代码实例

    配置间隔时间,定时打印日志  接到个需求,通过log4j定时打印日志,需求描述如下:需要能够定时打印日志,时间间隔可配.说到定时,首先想到了DailyRollingFileAppender类,各种定时,根据datePattern,这个可以参考类SimpleDateFormat类,常见的一些定时设置如下: '.'yyyy-MM: 每月 '.'yyyy-ww: 每周 '.'yyyy-MM-dd: 每天 '.'yyyy-MM-dd-a: 每天两次 '.'yyyy-MM-dd-HH: 每小时 '.'yy

  • Java日志软件Log4j的基本使用教程

    1.概述 1.1背景 在我们的日常开发中,日志记录非常重要.在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作:跟踪代码运行时轨迹,作为日后审计的依据:担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息. 1.2简介 Log4j(log for java)是Apache的一个开放源代码项目,它提供了一种细腻的日志管理方式.通过一个配置文件,我们可以多选择的控制每条日志的输出格式和目的地.通过定义信息的级别,我们也

  • 在Java下利用log4j记录日志的方法

    1.前言 log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布. Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中. Log4j是高度可配置的,并可通过在运行时的外部文件配置.它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,例如:数据库,文件,控制台,UNIX系统日志等. Log4j中有三个主要组成部分: loggers: 负责捕获记录信息. appenders : 负责发布日志信息,以不同的首选目

  • 深入浅析java web log4j 配置及在web项目中配置Log4j的技巧

    在上篇文章给大家介绍了Java log4j详细教程,本文给大家介绍java web log4j配置及web项目中配置log4j的技巧.具体详情请看下文吧. 首先给大家提供log4j.jar下载:http://logging.apache.org/log4j/1.2/download.html 一.java web项目使用log4j 1.在web.xml文件中添加 <!-- 配置log4j --> <context-param> <param-name>webAppRoo

  • Java log4j详细教程

    一:Log4j入门简介学习 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 此外,通过Log4j其他语言接口,您可以在C.C++..Net.PL/SQL程序中

  • java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    log4j输出多个自定义日志文件 如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢? 先看一个常见的log4j.properties文件,它是在控制台和test.log文件中记录日志: 复制代码 代码如下: log4j.rootLogger=DEBUG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layo

  • Java中 log4j日志级别配置详解

    1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙X了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就OK了.我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到...... 1.2 闲话少说,讲讲日志的发展故事(如果已经了解的可以跳过,直接看1.3日志配置) 要想

  • spring boot中的properties参数配置详解

    application.properties application.properties是spring boot默认的配置文件,spring boot默认会在以下两个路径搜索并加载这个文件 src\main\resources src\main\resources\config 配置系统参数 在application.properties中可配置一些系统参数,spring boot会自动加载这个参数到相应的功能,如下 #端口,默认为8080 server.port=80 #访问路径,默认为/

  • Java使用Log4j记录日志的方法详解

    首先去官网下载 一个压缩包 网址:  这里是 1.2.17的版本   下载之后解压就可以了 下面就从eclipse中添加 加压后的jar包 直接上图吧: 1. 2. 3. 4. 5. 导入之后就是写代码了 首先导入包:import org.apache.log4j.Logger; 然后创建 Logger写入器:private static Logger logger = Logger.getLogger(Test01.class.getName()); 下面这段代码提供参考以一个除法为例: im

  • Python中logging日志库实例详解

    logging的简单使用 用作记录日志,默认分为六种日志级别(括号为级别对应的数值) NOTSET(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40) CRITICAL(50) special 在自定义日志级别时注意不要和默认的日志级别数值相同 logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO.WARNING.ERROR.CRITICAL 级别的日志都会输出. |2logging常见对象 Logger:日志,

  • java中Spring Security的实例详解

    java中Spring Security的实例详解 spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案.并且可以很好与目前主流的认证框架(如CAS,中央授权系统)集成.使用spring security的初衷是解决不同用户登录不同应用程序的权限问题,说到权限包括两部分:认证和授权.认证是告诉系统你是谁,授权是指知道你是谁后是否有权限访问系统(授权后一般会在服务端创建一个token,之后用这个token进行后续行为的交互). spring

  • Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解 CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantLock.ReadWriteLock锁实现同步. 3.信号量Semaphore实现同步. 其中,synchronized关键字和Lock锁解决的是多个线程对同一资源的并发访问问题.信号量Semaphore解决的是多副本资源的共享访问问题. 今天

  • 详解Java中NullPointerException异常的原因详解以及解决方法

    NullPointerException是当您尝试使用指向内存中空位置的引用(null)时发生的异常,就好像它引用了一个对象一样. 当我们声明引用变量(即对象)时,实际上是在创建指向对象的指针.考虑以下代码,您可以在其中声明基本类型的整型变量x: int x; x = 10; 在此示例中,变量x是一个整型变量,Java将为您初始化为0.当您在第二行中将其分配给10时,值10将被写入x指向的内存中. 但是,当您尝试声明引用类型时会发生不同的事情.请使用以下代码: Integer num; num

  • Springboot项目中使用redis的配置详解

    程序结构: 一.配置 1. 在pom.xml中添加依赖 pom.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

  • Java中反射机制和作用详解

    前言 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象. 那么接下来大师就带你们了解一下反射是什么,为什么要学习反射? 下面我们首先通过一个实例来说明反射的好处: 方法1.不用反射技术,创建用户对象,调用sayHello方法 1.1 我们首先创建一个User类 package com.dashi; /** * Author:Java大师 * User对象,包含用户的id和姓名以及sayHello方法 */ public

  • Java中注解与原理分析详解

    目录 一.注解基础 二.注解原理 三.常用注解 1.JDK注解 2.Lombok注解 四.自定义注解 1.同步控制 2.类型引擎 一.注解基础 注解即标注与解析,在Java的代码工程中,注解的使用几乎是无处不在,甚至多到被忽视: 无论是在JDK源码或者框架组件,都在使用注解能力完成各种识别和解析动作:在对系统功能封装时,也会依赖注解能力简化各种逻辑的重复实现: 基础接口 在Annotation的源码注释中有说明:所有的注解类型都需要继承该公共接口,本质上看注解是接口,但是代码并没有显式声明继承关

随机推荐