log4j和java.util.logging.Logger

本文详细介绍了Log4j的配置方法及使用技巧,包括不同输出方式的选择、日志级别设置、配置文件的放置位置等核心内容,并对比了log4j与java.util.logging.Logger的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只要把log4j.properties放在classpath目录下即可,log4j和java.util.logging.Logger都有继承关系,类似树状结构管理继承关系,都有一个根日志,下面有子日志

比如appender为com.class.method继承自appender为com.class



web log4j.xml

http://blog.youkuaiyun.com/hu_shengyang/article/details/6754031


log4j.properties

ERROR、WARN、INFO、DEBUG
ERROR 为严重错误 主要是程序的错误
WARN 为一般警告,比如session丢失
INFO 为一般要显示的信息,比如登录登出
DEBUG 为程序的调试信息



appender后面是输出

设置logger有2个输出 .stdout.R,第一个 DEBUG表示日志输出级别,输出级别大于等于DEBUG的日志

log4j.rootLogger=DEBUG,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
#文件存储的日志文件名字
log4j.appender.R.File=mapreduce_test.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n


appender可选择以下任意一种:
a),org.apache.log4j.ConsoleAppender(控制台)
b),org.apache.log4j.FileAppender(文件)
c),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
d),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件,可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件)。
e),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

日志输出级别,级别从高到低:
  1. OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL  
  2.  OFF 为最高等级 关闭了日志信息  
  3.  FATAL  为可能导致应用中止的严重事件错误  
  4.  ERROR 为严重错误 主要是程序的错误  
  5.  WARN 为一般警告,比如session丢失  
  6.  INFO 为一般要显示的信息,比如登录登出  
  7.  DEBUG 为程序的调试信息  
  8.  TRACE 为比DEBUG更细粒度的事件信息  
  9.  ALL 为最低等级,将打开所有级别的日志

X号: X信息输出时左对齐;
 %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
 %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
 %r: 输出自应用启动到输出该log信息耗费的毫秒数
 %c: 输出日志信息所属的类目,通常就是所在类的全名
 %t: 输出产生该日志事件的线程名
 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
 %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
 %%: 输出一个"%"字符
 %F: 输出日志消息产生时所在的文件名称
 %L: 输出代码中的行号
 %m: 输出代码中指定的消息,产生的日志具体信息
 %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行

 

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。

如:

 1)   %20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。  2)   %-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。  3)   %.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

 4)   %20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。

log4j启动时,默认会寻找source folder下的log4j.xml配置文件,若没有,会寻找log4j.properties文件,然后加载配置

打成jar包时,只要把log4j.xml放在根目录下即可

def main(args: Array[String]) {
  val logger=Logger.getLogger("R")
  getLogger.info("xiao")
}
log4j.xml(供参考)
<?xml version="1.0" encoding="GBK" ?>    
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">    
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">      
    <!-- 输出日志到控制台  ConsoleAppender -->   
        <appender name="console"   
        class="org.apache.log4j.ConsoleAppender">  
        <param name="Threshold" value="info"></param>  
        <layout class="org.apache.log4j.TTCCLayout">  
            <param name="ConversionPattern" value="TTCCLayout"></param>  
        </layout>  
    </appender>  
  
    <!-- 输出日志到文件  每天一个文件 -->  
    <appender name="dailyRollingFile"  
        class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="Threshold" value="info"></param>  
        <param name="ImmediateFlush" value="true"></param>  
        <param name="File" value="c:/logs/dailyRollingFile.log"></param>  
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"></param>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n"></param>  
        </layout>  
    </appender>   
      
    <!-- 输出日志到文件  文件大小到达指定尺寸的时候产生一个新的文件 -->  
    <appender name="railyFile"   
        class="org.apache.log4j.RollingFileAppender">  
        <param name="File" value="D:/logs/railyFile.log"></param>  
        <param name="ImmediateFlush" value="true"/>  
        <param name="Threshold" value="info"></param>  
        <param name="Append" value="true"></param>  
        <param name="MaxFileSize" value="30KB"></param>  
        <param name="MaxBackupIndex" value="100"></param>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n"></param>  
        </layout>  
    </appender>  
  
    <!-- 输出日志到文件 -->  
    <appender name="file"  
        class="org.apache.log4j.FileAppender">  
        <param name="File" value="D:/logs/file.log"></param>  
        <param name="Threshold" value="info"></param>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n"></param>  
        </layout>  
    </appender>  
  
    <!--   
        定义全局的日志输出级别,但是在输出目的地的配置中配置的具体输出级别优先级高于全局定义的优先级。  
        如果在railyFile中定义<param name="Threshold" value="info"></param>,那么将会把info以上级别的信息输出  
     -->  
    <root>       
        <priority value="debug" />       
        <appender-ref ref="console" />    
        <appender-ref ref="dailyRollingFile" />    
        <appender-ref ref="railyFile" />    
        <appender-ref ref="file" />    
    </root>         
  
</log4j:configuration>  



java 自带的logger
java.util.logging
默认的 logging.properties 存放在 jre/lib/logging.properties,有效内容如下
handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.xyz.foo.level = SEVERE


logger.properties 放在classpath目录下
LOGGER.level = INFO
handlers = java.util.logging.ConsoleHandler,java.util.logging.FileHandler


java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.level = INFO
 
java.util.logging.FileHandler.pattern = D:/my.log%g.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.limit = 104857600
java.util.logging.FileHandler.count = 3
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.level = INFO
LoggerFactory类

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
import java.util.logging.Logger;


public class LoggerFactory {
    private static Logger logger = null;
    private LoggerFactory(){}
     
    public static Logger getLogger(){
        if (null == logger) {
            InputStream is  = LoggerFactory.class.getClass().getResourceAsStream("/logger.properties");
            try {
                LogManager.getLogManager().readConfiguration(is);
            } catch (Exception e) {
                logging.warning("input properties file is error.\n" + e.toString());
            }finally{
                try {
                    is.close();
                } catch (IOException e) {
                    logging.warning("close FileInputStream a case.\n" + e.toString());
                }
            }
             
            logger = Logger.getLogger("LOGGER");
        }
        return logger;

    }


     
    private static Logger logging = Logger.getLogger(LoggerFactory.class.getName());

}




### 如何在Java项目中用 `java.util.logging` 替代 Log4j 为了实现日志框架从 Log4j 到 `java.util.logging` 的转换,在使用 Simple Logging Facade for Java (SLF4J) 作为抽象层的情况下,可以采取如下措施: #### 移除旧依赖并引入新绑定 移除任何与 Log4j 或其他不希望使用的日志框架有关的库。对于 Maven 构建工具而言,这意味着更新项目的 POM 文件来排除不再需要的依赖项。 ```xml <dependencies> <!-- Remove these lines if they exist --> <!--<dependency>--> <!--<groupId>log4j</groupId>--> <!--<artifactId>log4j</artifactId>--> <!--<version>x.x.x</version>--> <!--</dependency>--> <!-- Add this line instead --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.7.30</version> <!-- Ensure version matches others --> </dependency> </dependencies> ``` 上述操作确保了应用程序仅通过 SLF4J 接口调用了 JDK 自带的日志功能[^1]。 #### 配置 `java.util.logging` 默认情况下,`java.util.logging` 使用位于 JVM 启动参数 `-Djava.util.logging.config.file=` 所指定路径下的配置文件;如果没有特别设置,则会读取 `$JAVA_HOME/lib/logging.properties` 中的内容。可以根据需求自定义该属性文件以调整输出级别、格式化样式以及目标位置等选项。 例如创建一个名为 `logging.properties` 的文件,并放置于类路径下: ```properties handlers= java.util.logging.ConsoleHandler .level= INFO java.util.logging.ConsoleHandler.level = ALL java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter ``` 此段落描述了如何改变处理器的行为模式及其关联的消息过滤器布局策略[^3]。 #### 更新现有代码中的静态导入(如果适用) 如果有直接引用 Log4j 类的地方——比如静态方法或常量字段——则需替换为对应的 `java.util.logging.Logger` 实例上的相应成员。通常来说,只要遵循面向接口编程的原则就不会遇到这种情况,因为所有的具体实现细节都已经被隐藏起来了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值