최근 Serilog
에 모든 .NET Framework의 현재 날짜를 기반으로 템플릿 경로를 지적하는 데 집중했습니다 LogEvent
. 이를 구현하는 방법을 파악 후, 나는 마지막으로 날짜 필드를 사용하여 비행의 경로를 해결 LogEvent
사용하여 Serilog.Sinks.Map
같은 다음과 같이 :
return new LoggerConfiguration().WriteTo
.Map(
// Log key
(LogEvent le) => le.Timestamp.Date,
// Log Action
(DateTime date, LoggerSinkConfiguration lc) =>
{
string path = GetFilesPath(date, logName);
lc.File(path);
}
);
public string GetFilePath(DateTime date, string logName) =>
Path.Combine("./Logs", $"{date:yyyy-MM-dd}", $"{logName}.log");
이를 통해 날짜를 기반으로 하위 폴더에 로그를 작성하는 목표를 달성했습니다.
문제는 Serilog
포인팅 경로가 변경되었음을 모르기 때문에 예상대로 파일 스트림을 닫거나 처리하지 않는다는 것입니다. 따라서 내 응용 프로그램은 파일을 매일 열어두고 무한대로 유지합니다.
누군가이 접근 방식에 직면했거나, 수동으로 스트림을 닫거나, Serilog
API가 어떻게 든 자동으로 해당 스트림을 닫는 다면 좋을 것 입니다.
Btw, 나는 사용하고있다
나중에 이것을 읽는 사람들을 위해 05/06/2020 을 편집하십시오 . 타임 스탬프로
모든 단일 로그 이벤트에 키를 지정 하는 것은 좋지 않습니다. 이렇게함으로써 실제로 로그 이벤트 당 항목을 추가합니다 (간단 함을 위해 동시에 생성되는 이벤트가 없다고 가정). 이론상지도에 이벤트를 유지하지 않는 to를 지정하더라도 해당 이벤트가 파일에 쓰도록 구성되어 있으면 (특히 싱크 와 함께 ) 해당 싱크가 메모리에서 삭제되거나 삭제되지 않습니다.sinkMapCountLimit
0
RollingFile
따라서 위의 코드 덩어리는 메모리 누출 (그리고 매우 빠름)입니다. 문서는 사실, 이것에 대해 경고합니다.Map.Sink
...하지만 가능한 키 값 세트가 개방형 인 경우에는 적합하지 않습니다.
Serilog.Sinks.Map은이sinkMapCountLimit
를 제어 하는 매개 변수 를 허용합니다 .
return new LoggerConfiguration().WriteTo
.Map(
// Log key
(LogEvent le) => le.Timestamp.Date,
// Log Action
(DateTime date, LoggerSinkConfiguration lc) =>
{
string path = GetFilesPath(date, logName);
lc.File(path);
},
sinkMapCountLimit: 5
);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다