JAVA的log4j如何实现程序重新启动会自动生成新的日志文件,文件名可以是当前日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA的log4j如何实现程序重新启动会自动生成新的日志文件,文件名可以是当前日期相关的知识,希望对你有一定的参考价值。

log4j输出日志文件时以当前日期为文件名

在初始化日志配置后加入以下代码:
Java代码 Appender appender = LogManager.getLoggerRepository().getRootLogger().getAppender("A2"); if(appender instanceof FileAppender) FileAppender fileAppender = (FileAppender)appender; fileAppender.setFile( "log/" + DateUtil.getFormatDate() + ".log"); fileAppender.activateOptions(); //DateUtil.getFormatDate();是指得到当前格式化后的日期

要是通过配置生成日期是不可能的
参考技术A 这个问题自己百度可以轻松解决的。
你搜索一下log4j配置就有了。
log4j.appender.prepay_search=org.apache.log4j.DailyRollingFileAppender
log4j.appender.prepay_search.File=$web.root/logs/prepay_search.log
log4j.additivity.prepay_search = false
log4j.appender.prepay_search.layout=org.apache.log4j.PatternLayout
log4j.appender.prepay_search.DatePattern = '.'yyyy-MM-dd
log4j.appender.prepay_search.layout.ConversionPattern=%-dyyyy-MM-dd HH\:mm\:ss [%c]-[%p] %m%n
这个是配置,你说的是org.apache.log4j.DailyRollingFileAppender 这个地方。这个是每天会产生新日志的。
参考技术B log4j.appender.R.File=log.txt的位置 希望可以帮到你

如何重新启动应用程序的更新循环

【中文标题】如何重新启动应用程序的更新循环【英文标题】:How to restart an update loop of an application 【发布时间】:2014-02-28 05:56:51 【问题描述】:

我正在使用 Java 和 Swing 开发绘图应用程序。只要布尔变量设置为true,它就有一个不断运行的不断更新循环。循环位于线程内。

它工作正常,但现在我希望循环仅在特定时间运行(仅在按下鼠标时),否则不运行。 (因此不会白白浪费内存)。

要停止循环,我只需将该变量设置为false。但我的问题是,停止循环后如何重新启动循环?将该变量设置回true 不会重新启动循环。有什么好的方法可以做到这一点?

编辑:我的(稍微简化的)循环:

public void run()

    int TICKS_PER_SECOND = 50;
    int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
    int MAX_FRAMESKIP = 10;

    long next_game_tick = System.currentTimeMillis();
    int loops;

    boolean app_is_running = true;

    while( app_is_running ) 

        loops = 0;
        while( System.currentTimeMillis() > next_game_tick && loops < MAX_FRAMESKIP) 

            update();

            next_game_tick += SKIP_TICKS;
            loops++;
        

        repaint();
    


【问题讨论】:

@peeskillet 当然,看我的编辑 @peeskillet 是的,但据我所知,有时停止线程是一个问题,它相对困难(启动它当然很容易)。但从理论上讲,您是在建议我在暂停循环时停止线程并在想要重新启动循环时启动它? 请查看docs.oracle.com/javase/7/docs/api/java/awt/SecondaryLoop.html How to stop and restart a loop inside a thread?的可能重复 【参考方案1】:

使用Object.wait 在线程不运行时挂起它。让另一个线程调用 Object.notify 将其从睡眠中唤醒。

【讨论】:

【参考方案2】:

要每FRAME_RATE ms 执行一次线程主体,同时由外部定义的布尔值控制,run 方法可以这样构造:

public void run()

    long delay;
    long frameStart = System.currentTimeMillis();

    // INSERT YOUR INITIALIZATION CODE HERE

    try
    
        while (true)
        
            if (active)  // Boolean defined outside of thread
            
                // INSERT YOUR LOOP CODE HERE
            

            frameStart += FRAME_RATE;
            delay = frameStart - System.currentTimeMillis();
            if (delay > 0)
            
                Thread.sleep(delay);
            
        
    
    catch (InterruptedException exception) 

此外,如果您想消除持续运行的循环的轻微开销(对于大多数 inactive 线程),while 循环中的布尔值可以替换为 Semaphore 对象:

while (true)

    semaphore.acquire();  // Semaphore defined outside thread with 1 permit

    // INSERT YOUR LOOP CODE HERE 

    semaphore.release();

    frameStart += FRAME_RATE;
    delay = frameStart - System.currentTimeMillis();
    if (delay > 0)
    
        Thread.sleep(delay);
    

要在外部停止循环,请使用semaphore.acquire();重新启动它使用semaphore.release()

【讨论】:

以上是关于JAVA的log4j如何实现程序重新启动会自动生成新的日志文件,文件名可以是当前日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在java程序中手动初始化log4j.xml?

Java日志体系 —— log4j2

Java项目中如何使用log4j和slf4j实现日志打印

Java - 自动配置log4j的日志文件路径

如何让IIS定时自动重新启动

我想让一个java程序(已打成jar包)开机自动启动,不启用命令行,该如何实现?