zoukankan      html  css  js  c++  java
  • 日志相关杂

    记录一个点:

    很多时候,生产环境的log4j appender会设置bufferIO。但是系统意外挂了就会丢失部分日志。通过下面的语句flush log4j的日志:

    LogManager.shutdown();
    

    或者:

    public static void flushAllLogs()
    {
        try
        {
            Set<FileAppender> flushedFileAppenders = new HashSet<FileAppender>();
            Enumeration currentLoggers = LogManager.getLoggerRepository().getCurrentLoggers();
            while(currentLoggers.hasMoreElements())
            {
                Object nextLogger = currentLoggers.nextElement();
                if(nextLogger instanceof Logger)
                {
                    Logger currentLogger = (Logger) nextLogger;
                    Enumeration allAppenders = currentLogger.getAllAppenders();
                    while(allAppenders.hasMoreElements())
                    {
                        Object nextElement = allAppenders.nextElement();
                        if(nextElement instanceof FileAppender)
                        {
                            FileAppender fileAppender = (FileAppender) nextElement;
                            if(!flushedFileAppenders.contains(fileAppender) && !fileAppender.getImmediateFlush())
                            {
                                flushedFileAppenders.add(fileAppender);
                                //log.info("Appender "+fileAppender.getName()+" is not doing immediateFlush ");
                                fileAppender.setImmediateFlush(true);
                                currentLogger.info("FLUSH");
                                fileAppender.setImmediateFlush(false);
                            }
                            else
                            {
                                //log.info("fileAppender"+fileAppender.getName()+" is doing immediateFlush");
                            }
                        }
                    }
                }
            }
        }
        catch(RuntimeException e)
        {
            log.error("Failed flushing logs",e);
        }
    }
    

    PS:可能要增加一个java代码的钩子, 在系统关闭的时候触发。  

            //增加关闭钩子
            Runtime.getRuntime().addShutdownHook(new Thread(){
                public void run(){
                         //STH TODO
                }
            });
    
    //移除关闭钩子
    Runtime.getRuntime().removeShutdownHook(hook);
    

      

    其实是“参考” stackoverflow的:

    http://stackoverflow.com/questions/3060240/how-do-you-flush-a-buffered-log4j-fileappender 

  • 相关阅读:
    动手动脑篇之类与对象
    团队精神
    在快乐中学习
    实习报告
    大道至简读后感(二)
    大道至简读后感
    读《大道至简》第一章有感
    指令随笔之:tail、cat、scp、&、&&、;、|、>、>>
    NFS安装过程
    CentOS7编译安装Nginx-1.8.1和编译参数
  • 原文地址:https://www.cnblogs.com/ELMND/p/5140184.html
Copyright © 2011-2022 走看看