IT story

log4net에서 프로그래밍 방식으로 버퍼를 플러시하는 방법이 있습니까?

hot-time 2020. 12. 25. 09:33
반응형

log4net에서 프로그래밍 방식으로 버퍼를 플러시하는 방법이 있습니까?


AdoNetAppender와 함께 log4net을 사용하고 있습니다. AdoNetAppender에 Flush 메서드 가있는 것 같습니다 . 어쨌든 내 코드에서 호출 할 수 있습니까?

데이터베이스 로그의 모든 항목을보기 위해 관리자 페이지를 만들려고합니다. log4net을 bufferSize = 100 (또는 그 이상)으로 설정하고 싶습니다. 그런 다음 관리자가 관리자에서 버튼을 클릭 할 수 있기를 바랍니다. log4net이 버퍼링 된 로그 항목을 데이터베이스에 기록하도록 강제하는 페이지입니다 (log4net을 종료하지 않음).

가능합니까?


log4net을 기본적으로 사용한다고 가정하면 다음과 같이 어 펜더를 파고 플러시 할 수 있습니다.

public void FlushBuffers()
{
    ILog log = LogManager.GetLogger("whatever");
    var logger = log.Logger as Logger;
    if (logger != null)
    {
        foreach (IAppender appender in logger.Appenders)
        {
            var buffered = appender as BufferingAppenderSkeleton;
            if (buffered != null)
            {
                buffered.Flush();
            }
        }
    }
}

편집 : 나는 당신이 특정 ILog(질문을 다시 읽었 으므로 아마도 나쁜 가정)에 대한 추가자를 플러시하고 싶다는 가정하에 위의 내용을 썼지 만 Stefan이 아래 주석에서 지적했듯이 코드를 단순화 할 수 있습니다. 다음과 같이 전체 저장소에서 모든 어 펜더를 플러시하려는 경우 거의 없습니다.

public void FlushBuffers()
{
    ILoggerRepository rep = LogManager.GetRepository();
    foreach (IAppender appender in rep.GetAppenders())
    {
        var buffered = appender as BufferingAppenderSkeleton;
        if (buffered != null)
        {
            buffered.Flush();
        }
    }
}

오늘날 더 간단한 옵션을 사용할 수 있습니다.

LogManager.Flush();

기본 저장소의 구성된 모든 어 펜더에 버퍼링 된 로깅 이벤트를 플러시합니다. https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

다음과 같이 시간 제한을 추가하는 것이 좋습니다.

LogManager.Flush(3000);

참조 URL : https://stackoverflow.com/questions/2045935/is-there-a-way-to-programmably-flush-the-buffer-in-log4net

반응형