精华内容
下载资源
问答
  • jdk日志
    2021-03-08 09:32:41

    日志(Log)是什么?字典对其的解释是"对某种机器工作情况或某项任务进展情况的记载"。对于应用系统来说,日志就应该记录应用系统的运行状况了。

    是否需要记录日志?这个问题无需回答,这是毋庸置疑的--当然要记了。

    剩下的问题就是应该如何记录日志才能确保日志具有高可用性和低耗性了。日志信息过于简化,乃至于没有日志,则用户无法找到解决问题所需的信息,进而妨碍问题的解决;然而日志信息过于详细不仅会降低系统的性能而且会使真正有用的信息淹没在文字的海洋中。

    为此JDK给出了建议的日志分级标准。将不同的信息根据其重要性分级。与此同时可以根据实际需要在JRE中设置需要记录的日志级别--级别高于此值的日志才被记录。依照JDK提供的标准(java.util.logging.Level)将日志划分为OFF、SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST、ALL等从高到低九个级别。他们都分别对应着唯一的整数值,即OFF=Integer.MAX_VALUE、SEVERE=1000、WARNING=900、INFO=800、CONFIG=700、FINE=500、FINER=400、FINEST=300、ALL=Integer.MIN_VALUE。通过对java.util.logging.Level的泛化(扩展),开发人员可以在JDK提供的标准基础之上定义自己的日志分级标准。

    在这九个级别中OFF、SEVERE、WARNING、INFO、CONFIG、ALL比较容易理解。

    OFF级别主要用于JRE日志输出控制,表示不输出任何信息。

    SEVERE(严重)级别描述组织程序正常运行的重大事件。这些事件的表述必须能够让最终用户和系统管理员清晰地了解到底发生了什么事情。

    WARNING(警告)级别描述了最终用户或系统管理员维护时比较感兴趣的事件,或指示系统存在潜在问题的事件。这些事件都需要特别提醒最终用户或系统管理员注意。

    INFO(信息)级别主要用于描述输出到控制台或其替代品的,具有相当程度重大意义的事件。譬如系统的心跳信息,以及其他系统希望告知最终用户或系统管理员的信息等。

    CONFIG(配置)级别主要用于描述可以辅助调试解决问题的静态配置信息。譬如CPU类型、操作系统类型、内存容量、系统语言等等。

    ALL级别也是主要用于JRE日志输出控制,表示输出所有日志信息。

    FINE、FINER、FINEST等三个级别被用于描述不同程度的跟踪信息。这三个级别被sun分别翻译为"良好","较好"和"最好",但是笔者认为翻译为"略细","较细","最细"更合适。这三个级别比较容易使人难于区分。到底什么样的信息应该以哪个级别输出呢?

    一般说来,FINE级别用于输出开发人员广泛关注的信息。包括小的可恢复的故障,潜在的性能问题、数据源连接不足、服务超时等。

    FINER级别描述比FINE级别更详细的信息。包括进入/返回方法调用,抛出了一个异常等信息。

    FINEST级别描述更详细的调试信息。包括开发人员在方法内为了调试方便而输出的调试信息,即某些日志分级系统中定义的DEBUG级别信息。

    将方法调用/返回信息作为一个单独的级别处理是一个明智的选择。在解决系统运行问题时,通常根据方法调用/返回过程就能大致确定问题所在。

    此日志分级标准被广泛地应用于中小型系统中。更详细的信息可以参考JDK

    API文档的java.util.logging部分。

    更多相关内容
  • 我一个项目在自己项目里面打印日志是生效的,但是一旦把这个项目 install 成 jar 包时,提供给其他项目引入 jar 使用后,再次触发打印这个 jar 里的日志时,原来的配置失效,这里特别指出的是时间格式化配置失效,...

    问题描述

    我一个项目在自己项目里面打印日志是生效的,但是一旦把这个项目 install 成 jar 包时,提供给其他项目引入 jar 使用后,再次触发打印这个 jar 里的日志时,原来的配置失效,这里特别指出的是时间格式化配置失效,因为后面通过日志 Level 能确定是生效的,但是时间格式化配置始终不生效。 

    Jar 代码 

    package com.jite.flow.engine;
    
    import java.io.IOException;
    import java.util.logging.LogManager;
    import java.util.logging.Logger;
    
    /**
     * @author Lux Sun
     * @date 2021/10/19
     */
    public class LoggerBuilder {
    
        public static final Logger LOG = Logger.getLogger(LoggerBuilder.class.getName());
    
        static {
            if (System.getProperty("java.util.logging.config.file") == null &&
                    System.getProperty("java.util.logging.config.class") == null) {
                try {
                    LogManager.getLogManager().readConfiguration(LoggerBuilder.class.getResourceAsStream("/log.properties"));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void build() {
            LOG.info("Load the Logger successfully");
        }
    }
    handlers=java.util.logging.ConsoleHandler
    java.util.logging.ConsoleHandler.level=INFO
    java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
    java.util.logging.SimpleFormatter.format=%1$tF %tT.%1$tL %4$s [%2$s] - %5$s %6$s%n

    分析原因

    默认情况下,JDK的LogManager会在JRE目录下的"lib/logging.properties"这个文件中读取配置。

    除此之外,LogManager还可以根据两个系统属性来允许用户控制日志的配置

    • "java.util.logging.config.class"
    • "java.util.logging.config.file"

    其中,class这个属性优先有效,如果设置,会忽略file这个属性。

    而且关于 JAVA 代码中的日志级别的设置,在JDK中实际上是有默认的日志级别的。

    在配置文件:%JAVA_HOME%\jre\lib\logging.properties中;如果JAVA设置的级别比配置文件中配置的还要低,则以配置文件中配置的为准,如果比配置文件中的高,则以程序中配置的为准。

    解决方案

    Java中设置属性也有两种方法

    • Preferences API
    • 启动的时候,命令行参数

    使用Preferences API设置如下

    System.setProperty("java.util.logging.config.class", "Your class");

    System.setProperty("java.util.logging.config.file", "Your properties file");

    设置之后需要调用以下代码方可生效:

    LogManager.getLogManager().readConfiguration();

    命令行参数是指,启动的时候用 -D<name>=<value>的方式指定属性,具体到这里,我们就可以用

    java -Djava.util.logging.config.file=abc.properties YourMainClass

    指定使用 abc.properties 这个文件作为配置文件。如果需要,可以加上文件的路径名。

    Tomcat 指定日志配置文件就是使用的命令行参数,用记事本打开 ${tomcat_home}/bin/catalina.bat 文件,可以看到如下内容

    if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
    set LOGGING_CONFIG=-Dnop
    if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
    set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
    :noJuliConfig
    set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%

    一个简单的自定义配置文件如下

    ############################################################
    #  	Default Logging Configuration File
    #
    # You can use a different file by specifying a filename
    # with the java.util.logging.config.file system property.  
    # For example java -Djava.util.logging.config.file=myfile
    ############################################################
    
    ############################################################
    #  	Global properties
    ############################################################
    
    # "handlers" specifies a comma separated list of log Handler 
    # classes.  These handlers will be installed during VM startup.
    # Note that these classes must be on the system classpath.
    # By default we only configure a ConsoleHandler, which will only
    # show messages at the INFO and above levels.
    handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
    
    # To also add the FileHandler, use the following line instead.
    #handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
    
    # Default global logging level.
    # This specifies which kinds of events are logged across
    # all loggers.  For any given facility this global level
    # can be overriden by a facility specific level
    # Note that the ConsoleHandler also has a separate level
    # setting to limit messages printed to the console.
    .level= INFO
    
    ############################################################
    # Handler specific properties.
    # Describes specific configuration info for Handlers.
    ############################################################
    
    # default file output is in user's home directory.
    #java.util.logging.FileHandler.pattern = %h/java%u.log
    #java.util.logging.FileHandler.pattern = ..\\logs\\logger.log
    java.util.logging.FileHandler.pattern = C:\\zzj\\logger.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.FileHandler.formatter = java.util.logging.SimpleFormatter
    
    # Limit the message that are printed on the console to INFO and above.
    java.util.logging.ConsoleHandler.level = INFO
    #java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    java.util.logging.ConsoleHandler.formatter = java.util.logging.XMLFormatter
    
    
    ############################################################
    # Facility specific properties.
    # Provides extra control for each logger.
    ############################################################
    
    # For example, set the com.xyz.foo logger to only log SEVERE
    # messages:
    com.xyz.foo.level = SEVERE
    

    在默认配置文件的基础上添加了FileHandler,并且指定日志文件路径为C:\\zzj\\logger.log,使用SimpleFormatter格式化输出。

    注意:日志文件路径不能直接在盘符下,例如不能指定日志文件路径为C:\\logger.log。

    当然,这里还引发另一个问题

    我试图在我的应用程序启动时加载自定义log.properties文件。

    我的属性文件和我的主类在同一个包中,所以我认为如下命令行参数应该加载属性文件。

    -Djava.util.logging.config.file=log.properties

    但是,只有当我指定属性文件的完整绝对路径时才加载属性。任何建议如何使用相对路径?

    Java日志记录不会搜索整个硬盘中的文件;有很简单的规则如何查找文件。你希望Java能够看到这两个文件是属于彼此的,但是你没有在任何地方说过。由于Java认为属性文件和类之间没有连接,除非它们位于磁盘上的相同文件夹中,所以它找不到该文件。

    -Djava.util.logging.config.file=log.properties

    仅适用于文件log.properties位于Java进程的当前目录中(可能非常随机)。所以你应该在这里使用绝对路径。

    另一种解决方案是将文件logging.properties移动到$JAVA_HOME/lib/(或编辑应该在那里的文件)。在这种情况下,您不需要设置系统属性。

    util logging不从类路径加载,它需要一个绝对路径,这就是为什么其他日志包如log4j更容易配置,并且更适合web应用程序,这对于获取abs路径是一件痛苦的事情。

    这在java.util.logging.LogManager doco中根本没有解释。

    展开全文
  • JDK日志框架

    千次阅读 2011-11-23 10:26:08
    JDK日志框架   1. 初衷:日志记录对于软件的维护,特别是对于已经部署到运行环境之后的软件调试有着重要的意义. 2. 背景:java 1.4开始,JDK包括了一个崭新的日志框架包 java.util.logging.  复杂的日志功能...
     

                                                                                                                                                 JDK日志框架

     

    1.       初衷:日志记录对于软件的维护,特别是对于已经部署到运行环境之后的软件调试有着重要的意义.

    2.       背景:java 1.4开始,JDK包括了一个崭新的日志框架包 java.util.logging.

            复杂的日志功能,JDK框架具有足够的可扩展能力,可以定义不同需求的日志处理,消息格式化,日志消息级别等组件

     

    3.       日志系统诞生前的遐想:(心目中的日志系统应该做的事情)

    1.记录日志的对象:负责记录日志的信息,可以输出到不同的位置:控制台,文件甚至网络。

    2.信息的格式:输出文本,xml,HTML格式

    3.日志信息的级别分类:过滤冗余信息,保留关键日志.

    4.日志对象必须是可配置的:配置输出到指定的目标,输出格式和决定何种级别以上的日志才能输出。配置的形式:1.代码的形式

                              2.配置文件的形式:对于已经部署到运行环境中的软件而言,可以非常方便的改变日志配置而无需改变其源代码.

     

    4.       JDK对日志系统遐想条件的一一对应实现

    1.       Logger:日志记录对象,用于记录日志信息

    2.       Handler:用于处理日志信息的输出,在Handler类中,可以决定日志是输出到文件还是控制台。

    3.       Filter:用于过滤日志,在filter类中可以根据日志级别或者某种条件来来决定是否输出该日志信息,这样达到去除冗余信息的目的.

    4.       Formatter:用于格式化日志信息,给类可以将日志文本格式化为XML或HTML格式,这完全依赖于具体的实现。

    5.       Level:用于表示日志的级别,JDK框架默认级别有:SERVER,WARNING,INFO,CONFIG,FINE,FINER,FINEST.

     

    5.JDK日志框架的工作流程(各个组件的协同关系)

     

    Logger对象首先判断日志级别是否满足输出级别的要求,满足要求的消息交给所配置的Handler对象。

    如果日志对象配置了一个Filter对象,那么Filter对象会对日志信息做一次过滤。

    Handler对象接受到日志消息后,根据所配置的格式化类Formatter改变输出格式,根据所配置的Filter对象和level对象再次过滤日志信息,最后输出到该Handler对象指定的输出位置,可以是控制台,文件,网络socket甚至是内存缓存区

     

    其结构模型如下: 

     

     

    Application----------------------> Logger------------------------->Hanlder---------------------------------------------------------->outside

                                                             |                                                 |

                                                             |                                                 |

                                                             |                                                 |

                                                         Filter                                          Filter,Formatter

     JDK支持的Handler类:

     ConsoleHandler:输出日志到控制台

     FilerHandler:     输出日志到指定的文件中

     MemoryHandler:  输出日志到内存缓存区中,当一定的条件满足的时候(如某种关键字的日志信息)再将缓存区的日志输出。

     SocketHandler:   输出日志到网络Socket中.

     StreamHandler:   输出日志到输入输出流对象中.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • NULL 博文链接:https://samjavaeye.iteye.com/blog/938657
  • Java——JDK内置日志

    千次阅读 2017-09-27 17:53:29
    import java.io.IOException; import java.util.logging.*;public class Tests { /** * --日志级别 * SEVERE (HIGHEST LEVEL) * WARNING * INFO * CONFIG * FINE * FI
    import java.io.IOException;
    import java.util.logging.*;
    
    public class Tests {
    
        /**
         * --日志级别
         *   SEVERE (HIGHEST LEVEL)
         *   WARNING
         *   INFO
         *   CONFIG
         *   FINE
         *   FINER
         *   FINEST (LOWEST LEVEL)
         *
         * --创建,一般当前类作为日志名称
         *   Logger logger = Logger.getLogger(MyClass.class.getName());
         *
         * --Appenders类型
         *   console 控制台;file 文件;socket 远程
         *
         */
    
        public static void main(String[] args){
            Logger logger = Logger.getLogger(Tests.class.getName());//创建日志,一般以当前类的全类名作为名称
    
            //输出到本地文件
            FileHandler handler = null;
            try {
                handler = new FileHandler("E://TestsLog",1000000,10,true);// 将日志消息转发给期望的输出,这里输出到文件;
            } catch (IOException e) {
                logger.severe("文件夹不存在");
            }
    
            //输出到控制台
            //ConsoleHandler handler=new ConsoleHandler();
    
            //输出到远程
    //        try {
    //        SocketHandler handler = new SocketHandler("localhost", 8080);
    //        } catch (IOException e) {
    //            logger.severe("请检查地址和端口是否正确......");
    //        }
    
    
            logger.addHandler(handler);
    
            logger.setLevel(Level.ALL);//设置记录的级别
    
            SimpleFormatter formatter = new SimpleFormatter();//格式化;还可以用XMLFormatter
            handler.setFormatter(formatter);
    
            logger.warning("代码有问题");//添加记录
    
        }
    
    }
    
    展开全文
  • JDK1.8最新

    2018-05-15 17:43:58
    jdk1.8 jdk1.8 jdk1.8 jdk1.8 jdk1.8 jdk1.8 jdk1.8 jdk1.8
  • JDK11 GC日志输出

    千次阅读 2021-12-13 11:24:02
    总结一下日志输出的几个命令: -XX:+PrintGC 输出简略信息 -XX:+PrintGCDetails 输出详细信息 -XX:+PrintGCTimeStamps 输出...上述gc日志是在JDK1.8中常用到的,但是在jdk11中已经被标记为过时 那么在jdk11中...
  • 配置JDK环境变量及出现的乱码问题
  • 主要介绍了Java使用JDK与Cglib动态代理技术统一管理日志记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java中动态代理主要有JDK和CGLIB两种方式。 区别主要是jdk是代理接口,而cglib是代理类。 优点:这种方式已经解决我们前面所有日记需要的问题。非常的灵活。而且可以方便的在后期进行维护和升级。 缺点:当然使用jdk...
  • Jdk动态代理 底层

    2021-01-20 03:10:25
    动态代理的应用范围很广,例如:日志、事务管理、缓存等。本文将模拟@Cacheable,即缓存在动态代理中的应用进行讲解。需要注意的是,Jdk动态代理相比起cglib动态代理,Jdk动态代理的对象必须实现接口,否则将报错。...
  • 下面小编就为大家带来一篇解决调试JDK源码时,不能查看变量的值问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 日志框架. 实现了动态的切换和log4j类似功能. 采用jdk1.4 log为底层实现. 下载后可以自己定制相关功能. 可以进一步完善.有兴趣可以加QQ:934547801一起讨论
  • 当生产环境有很多服务器、很多业务模块的日志需要每时每刻查看时系统:centos6.5JDK:1.8Elasticsearch-5.0.0Logstash-5.0.0kibana-5.0.01、安装JDK下载JDK:...将安装包拷贝至安装服务器/usr/local目录[root@localhost...
  • 动态代理Aop
  • 简单的建立数据连接池并包装查询代码及JDK自带日志使用
  • JDK8 新特性学习.rar

    2020-01-19 16:31:28
    如果你不会JDK1.8的新特性,这部资料绝对物超所值,里面有JDK1.8新特性的入门文档,还有自己整理的性能对比等给同事学习分享笔记,看完学习稍微实践一下,就可以完成入门到上手了,纯干货,5分不贵哈。
  • jdk1.8 JDK1.8 中文 CHM

    2018-07-23 09:44:50
    JDK API 1.8.CHM是一款jdk1.8中文版的API帮助文档,可以帮助使用java,jdk的用户们通过api及时查找到对应的类,接口,框架等详细信息的帮助手册。
  • 简单建立数据库连接池及简单包装查询代码 使用JDK自带日志输出日志
  • jdk1.8.0绿色解压版

    2018-08-01 20:52:08
    程序员间最好的祝福:祝您工作愉快,永无BUG,永不宕机!jdk1.8.0绿色解压版,解压之后如同平时一样配置java环境变量,即可用,很方便 对于有的时候工程需要经常切换版本的开发人员来说,简直就是福音。
  • JDK1.8和JDK1.6API帮助文档
  • JDK自带的日志Logging

    万次阅读 2016-02-22 16:36:19
    OK,现在我们来研究下JDK自带的日志Logger。 从jdk1.4起,JDK开始自带一套日志系统。JDK Logger最大的优点就是不需要任何类库的支持,只要有Java的运行环境就可以使用。 相对于其他的日志空间,JDK自带的日志可谓...
  • JavaEE学习日志(七十八)LinuxLinux安装jdkLinux安装MySQLLinux安装tomcatLinux安装RedisLinux部署商城项目Linux数据库的中文乱码问题 Linux Linux安装jdk 首先卸载Linux自带的jdk 查看当前Linux系统是否已经安装...
  • linux安装jdk并配置环境,第一步:创建jdk安装目录(该/usr/local/src 目录是空的,最好把我们自己下载的放到这,容易区分)  命令:mkdir -p /usr/local/src/jdk 第二步:查看安装程序  命令:rpm -qa | grep -i ...
  • logback-cfca-jdk1.6-3.1.0.0.jar
  • log4j 是apache 提供的记录日志的jar 档。 下载地址:http://logging.apache.org/log4j/1.2/download.html 除了这个包外,还需要另一个jar包:.commons-logging.jar 下载地址:...
  • JDK自带日志工具Logger的研究使用

    万次阅读 2016-10-11 00:53:20
    最近放假在家无聊,研究一个...点开源码看,才发现是JDK自带的日志类,非第三方开源Jar包,于是便起了好奇之心,想看看这个Logger与log4j和commons-logging有何不同,翻了翻Blog,使用研究一番,此处说下我的初步体验。
  • 根据深入理解JAVA虚拟机一书描述,JDK版本1.7,在申请4M内存时由于年轻代空间不足需要进行GC,将allocation,allocation2,allocation3移至老年代,然后将allocation4放入年轻代,所以年轻代4M空间,老年代6M。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 228,469
精华内容 91,387
关键字:

jdk日志