Konfiguracja logowania serwisów nAxiom
Podsumowanie:Logowanie informacji z serwisów nAxiom obsługujących server side, to jest opartych na platformie .NET, odbywa się przy użyciu oprogramowania NLog. Za konfigurację logowania odpowiadają pliki nlog.config w podfolderach poszczególnych serwisów w folderze instalacyjnym witryny. Informacje są logowane w pliku bazy danych SQLite (log.db3) i lub plikach textowych w podfolderze logs dla poszczególnych serwisów.
Info
W przypadku aktualizacji witryny nAxiom, instalator archiwizuje znalezione pliki db3, zmieniając im nazwę na Log-<znacznikczasu>.db3_arch.
W plikach logów w formacie SQLite (db3) logowane są następujące informacje:
- MachineName: nazwa komputera
- Timestamp: znacznik czasu zdarzenia
- Level: poziom istotności zdarzenia; patrz niżej
- TenantIdentity: identyfikator tenanta
- UserIdentity: id zalogowanego użytkownika (jeśli dostępne)
- HttpRequestTraceIdentifier: unikalny identyfikator żądania HTTP pozwalający łączyć wiele informacji zalogowanych w obrębie jednego żądania obsługiwanego przez system.
- ControllerName: nazwa kontrolera
- ActionName: nazwa akcji
- Logger: nazwa modułu rejestrującego dany wpis
- Message: treść komunikatu
- Exception: zgłoszony wyjątek
- CustomParamModel: wartości parametrów używanych w zapytaniu SQL wykonywanym w ramach akcji (JSON); zapisywane tylko dla poziomu istotności Error
- QueryModel: jak wyżej
- RequestName: nazwa żądania
- Request: treść żądania
- MigrationLogId: identyfikator logu migracji
Pliki nlog.config to pliki XML z konfiguracją logowania każdego serwisu dotnetowego. Plik musi zawierać dwie sekcje:
- targets: miejsca docelowe logowania informacji; np. plik tekstowy, plik bazy danych, konsola, e-mail.
- rules: reguły logowania informacji; zawierają elementy logger, które wiążą miejsca docelowe z poziomem istotności.
Elementy logger mają następujące atrybuty:
- name: nazwa wzorca logowania;
- minlevel: minimalny poziom istotności;
- maxlevel: maksymalny poziom istotności;
- level: konkretny poziom istotności;
- levels: rozdzielana przecinkami lista poziomów istotności;
- writeTo: rozdzielana przecinkami lista elementów target, w których mają być zapisywane informacje;
- final: po tej regule nie są przetwarzane żadne inne reguły;
- enabled: ustawienie wartości false wyłącza regułę z przetwarzania.
Przykładowa konfiguracja pliku nlog.config (dla serwisu api):
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Error"
internalLogFile="${basedir}/logs/internal-nlog.txt">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!--Błędy uniemożliwiające działanie aplikacji-->
<variable name='FatalLevel' value='Fatal'/>
<!--Błędy, które mogą, ale nie muszą, zatrzymać aplikacji-->
<variable name='ErrorLevel' value='Error'/>
<!--Nieoczekiwane zdarzenia, które nie zatrzymują aplikacji-->
<variable name='WarnLevel' value='Warn'/>
<!--Normalne zdarzenia podczas działania aplikacji-->
<variable name='InfoLevel' value='Info'/>
<!--Informacje do debugowania-->
<variable name='DebugLevel' value='Debug'/>
<!--Szczegółowe informacje do debugowania-->
<variable name='TraceLevel' value='Trace'/>
<!--Wyłączenie logowania-->
<variable name='OffLevel' value='Off'/>
<targets>
<!--Plik tekstowy; atrybut layout definiuje rejestrowane ingformacje-->
<target xsi:type="File"
name="logfile"
maxArchiveFiles="7"
archiveAboveSize="10485760"
fileName="${basedir}/logs/${shortdate}_logs-all.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|
${logger}|${message} ${exception:format=tostring}" />
<!--Plik bazy danych; atrybut commandText definiuje zapytanie tworzące
tabelę z rejestrowanymi informacjami-->
<target name="sqlitedb" xsi:type="Database" keepConnection="false"
dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite"
connectionString="Data Source=${basedir}/Log.db3;"
commandText="insert into Logs(MachineName, Timestamp, Level, TenantIdentity,
UserIdentity, ControllerName, ActionName, Logger, Message, Exception, CustomParamModel,
QueryModel, Request, RequestName, HttpRequestTraceIdentifier, MigrationLogId)
values(@MachineName, @Timestamp, @Level, @TenantIdentity, @UserIdentity,
@ControllerName, @ActionName, @Logger, @Message, @Exception, @CustomParamModel,
@QueryModel, @Request, @RequestName, @HttpRequestTraceIdentifier, @MigrationLogId)">
<parameter name="@MachineName" layout="${machinename}" />
<parameter name="@Timestamp" layout="${date}" />
<parameter name="@Level" layout="${level}" />
<parameter name="@TenantIdentity" layout="${mdc:item=TenantGuid}" />
<parameter name="@UserIdentity" layout="${mdc:item=UserGuid}" />
<parameter name="@ControllerName" layout="${aspnet-mvc-controller}" />
<parameter name="@ActionName" layout="${aspnet-mvc-action}" />
<parameter name="@Logger" layout="${logger}" />
<parameter name="@Message" layout="${message}" />
<parameter name="@Exception" layout="${exception:tostring}" />
<parameter name="@CustomParamModel" layout="${mdlc:CustomParamModel}" />
<parameter name="@Request" layout="${mdlc:Request:when=level=LogLevel.Error}" />
<parameter name="@RequestName" layout="${mdlc:RequestName}" />
<parameter name="@HttpRequestTraceIdentifier" layout="${aspnet-traceidentifier}" />
<parameter name="@QueryModel" layout="${mdlc:QueryModel}" />
<parameter name="@MigrationLogId" layout="${mdlc:item=MigrationLogId}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="${OffLevel}" writeTo="logfile" />
<!--Pominięcie wpisów z modułów Microsoft i IdentityServer4
do poziomu Info włącznie-->
<logger name="Microsoft.*" maxlevel="${InfoLevel}" final="true" />
<logger name="IdentityServer4.*" maxlevel="${InfoLevel}" final="true" />
<!-- Zapis wszystkich informacji od poziomu Info do pliku bazy danych-->
<logger name="*" minlevel="${InfoLevel}" writeTo="sqlitedb" />
</rules>
<!-- Uwzględnienie innych plików nlog -->
<include file="nlog-*.config" />
</nlog>
Powiązane tematy: