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 

  • 相关阅读:
    会议开饭
    计算时间差(c#和sqlServer)
    sqlserver 新增表字段
    javascript刷新父页面的各种方法汇总
    java 从List中随机取出一个元素
    解决Appium 抓取toast(java篇)
    appium java-client 5.0以后移除了swipe方法,也就是无法使用driver.swipe()了
    appium怎么按下系统按键?如按下返回键、home键等等
    Android 常用 adb 命令总结
    appium Capabilities的各个标签
  • 原文地址:https://www.cnblogs.com/ELMND/p/5140184.html
Copyright © 2011-2022 走看看