블로그에는 글을 너무 안쓴 모양이다... 아주 초반부터 사용하던 이런 것조차 없어서 작성한다.

Serilog는 로그를 아주 손쉽게 콘솔 또는 파일로 작성가능하도록 하는 너겟? 누겟? 패키지이다.
참고로 콘솔에도 로그를 찍고 싶다면 : Serilog.Sinks.Console을,
로그파일로도 작성하고 싶다면 : Serilog.SInks.File을 같이 설치 해주어야 한다.
설치과정만 세분화 되어있을 뿐 각 용량이나 설치시간은 매우 짧고 using Serilog만 치면 나머지 둘은 알아서 따라오기 때문에 아주 간편하다.
필자같은 경우는
로그찍을때 파일 경로 등 때문에
LogHandler 라는 이름으로 클래스를 하나 작성하는데 그 방법대로 설명하려고 한다.
class LogHandler
{
public string today;
public string[] todayYMD;
public string logFilePath;
public LogHandler()
{
today = DateTime.Now.ToString("yyyy-MM-dd");
todayYMD = today.Split('-');
logFilePath = $"프로젝트명-logs/{todayYMD[0]}/{todayYMD[0]}-{todayYMD[1]}/프로젝트명-log-.txt";
}
}
사실 이 방법은 바보 같을 수도 있다. 결국에는 logFilePath 하나만을 사용하기 때문이다.
하지만 한번 만들어두니 알아보기도 쉬워서 매번 복사해다 쓰고 있다.
------------------------------------------------------
다음은 main() 또는 program.cs에 작성해야하는 부분이다.
using Serilog; 하나면 Serilog.Sinks~류 들을 별도로 설치했다고해서 using도 또 써줘야하는건 아니다.
아래 소스는 위에서 만든 클래스를 선언하여 logFIlePath를 담을뿐
실질적으로Log.Logger 부분만 봐도 무방하다.
using Serilog;
LogHandler logHandler = new();
Log.Logger = new LoggerConfiguration()
//.WriteTo.Console() // Serilog.Sinks.Console를 설치한 경우 사용가능
.WriteTo.File( // Serilog.Sinks.File를 설치한 경우 사용가능
logHandler.logFilePath, // 로그를 지정할 파일 경로
rollingInterval: RollingInterval.Day,
retainedFileCountLimit: null,
fileSizeLimitBytes: 50 * 1024 * 1024,
rollOnFileSizeLimit: true,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}")
.MinimumLevel.Information() // 로그 최저레벨을 설정한다.
// .MinimumLevel.Is(Serilog.Events.LogEventLevel.Information) // 바로 위 .MinimumLevel.Information()를 제거하고 이 방법을 사용하면 설정 등으로 가져와서 최저레벨을 지정할 수도 있다.
.CreateLogger();
WriteTo.Console() 소스에 주석으로 적혀있기 때문에 패스하고
WriteTo.File()에는 여러가지 변수가 올 수 있는데
1. rollingInterval은 새로 파일을 만드는 기간 또는 주기를 말하는 것이다.
위 소스에는 RollingInterval.Day이기 때문에 일이 바뀔때마다 새로운 날짜의 파일이 생성된다.
2. retainedFileCountLimit은 로그파일 갯수 상한을 정하는 것이다.
필자의 경우는 서버 관리자가 직접 지울만큼 쌓이기 전까지는 보관하는 것을 선호하기 때문에 null을 입력했다.
그러나 하드용량이 매우적은 컴퓨터나 서버에서 사용한다면 제한을 두는 것이 좋다.
3. fileSizeLimitBytes는 로그파일의 최대크기를 정해놓는 것으로 byte단위로 입력하면 된다. 필자의 짧은 경험상으로는 50mb가 넘어가면 키는데 좀 딜레이가 생기는 것 같아서 저렇게 작성했다.
4. rollOnFileSizeLimit: 은 3번에서 지정한 로그파일의 용량 한계가 넘어가면 어떻게 할지를 결정하는 것이다. true면 다음 파일을 생성하고 false면 로그파일의 용량이 한계에 다다르면 더이상 파일을 작성하지 않는다. 따라서 근방의 로그가 작성되지 않길 바랄리가 없기 떄문에 true를 해야만 한다.
5. outputTemplate: 은 찍히는 로그의 모양을 나타낸 것이다. 미세한 시간차이를 확인하고 싶은게 아니라면 fff를 빼도 좋다.
시간 그 부분 제외하고는 딱히 수정해본적이 없기 때문에 필요하다면 Template작성방식을 검색해보아야 할 것이다.
그리고
.MinimumLevel. 은 찍히는 최저로그레벨을 정하는 것이다.
필자가 기억하기로 Verbose, Debug, Information, Waring, Error, Fatal 정도가 있는데
우측으로 갈수록 높은 레벨이다. 따라서 .MinimumLevel.Information()으로 작성하면 Information, Waring, Error, Fatal 는 찍히고 Verbose, Debug는 무시된다.
( .MinimumLevel.Information() - Information()자리에 Verbose()부터 Fatal()까지 모두 올 수 있다)
.MimimumLevel은 Is()라는 함수도 갖고있는데 변수로 Serilog.Events.LogEventLevel 안에있는 프로퍼티들을 사용할 수 있다. 위의 .MinimumLevel.과 동일한 기능이다. 그러나 Is()가 매력적인 것은 개발시 미리 지정이 아니라 실행시 어떤 로직에 따라서 로그 최저레벨을 정할 수 있다는 점이다.
예를 들면 .MinimumLevel.Is(WhatIWant()) 로 두고
public WhatIWant()의 리턴값으로 Serilog.Events.LogEventLevel.Warning 등을 사용하여 결정할 수있다.
------------------------------------------------------
마지막으로 예제 및 serilog의 서식문자열 사용법을 설명하고 포스팅을 마치도록 하겠다.
// 서식문자열의 사용방법
// Console.WriteLine()에서는 {순서,글자너비 + 좌우 정렬여부}
// -> Console.WriteLine("{0,-10} | {1,-20}", "asdfsadfs", "test1string");
// 방식으로 사용하지만 Serilog의 서식문자열 형식은 별도로 정해져있음
// 순서가 아닌 아무런? 단어를 사용하고 쉼표(,) 앞뒤에 공백이 없어야만 함
// (필자는 버릇처럼 띄어쓰기를 넣다가 꽤많은 출력실패를 경험하였음)
Log.Information("| {Status,-10} | {Address,-30} | {RoundtripTime,-15} | {BufferLength,-20} |",
"Status", "Address", "RoundTrip time", "Buffer size");
// 다양한 로그레벨로
string a = "아무 문자열";
Log.Verbose($"아무아무아무아무 {a}");
Log.Debug("껄껄껄");
Log.Information(@"C:\directory\ddong");
Log.Waring("위험!! 위험!!");
Log.Error("에러가 나부러쓰");
Log.Fatal("치명적~");
마지막으로,
throw new Exception("여기서 적는말은 에러다");
throw new Exception으로 string 문자열을 던지면 익셉션이 던져진 것과 별개로
Log.Error에 적은 것처럼 로그가 남는다.
asp.net core 프로젝트에서도 appsettings.json으로 설정정보를 담은 serilog를 사용할 수 있다.
이는 차후에 적도록하겠다.
23년에 이 글과 비슷하게 작성했는데 링크를 깜빡하여 25년 초에 붙입니다.
link:
https://pichen.tistory.com/m/49
[c# dotnet nuget] Serilog.AspNetCore
안녕하세요. 이 카테고리의 지난 글에서 Serilog를 설명드렸는데요. (이전 글 링크 : https://pichen.tistory.com/48) [c# - dotnet nuget] serilog 블로그에는 글을 너무 안쓴 모양이다... 아주 초반부터 사용하던
pichen.tistory.com
'language & Framework > .NET lib & nuget' 카테고리의 다른 글
[.Net 라이브러리] (C#) System.Net.Mail - 프로그램으로 이메일 발송하는 방법 (0) | 2024.05.09 |
---|---|
[.NET 라이브러리] System.Text.Json (0) | 2023.11.07 |
[c# dotnet nuget] MsgReader (0) | 2023.11.07 |
[c# dotnet nuget] Newtonsoft.Json (0) | 2023.10.27 |
[c# dotnet nuget] Serilog.AspNetCore (0) | 2023.10.27 |