Работа с логированием в asp.net

Посмотрим логи которые пишет iis сервер по умолчанию. Установим elmah и nlog логирования. Первый удобен тем что имеет веб интерфейс. Второй позволяет писать логи в текстовый файл, что удобно когда нужно исследовать участок кода более подробно.

  1. Логи по умолчанию расположены в c:\inetpub\logs\LogFiles\W3SVC{Id}. Id — это идишник сайта, его можно посмотреть в iis manager.
  2. Чтобы установить elmah логирование в mvc нужно  установим пакет elmah.mvc при помощи nuget.
    В Web.config nuget пропишет такие строчки

    <sectionGroup name="elmah">
        <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
        <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
        <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
        <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>
    ...
    <appSettings>
        <add key="elmah.mvc.disableHandler" value="false" />
        <add key="elmah.mvc.disableHandleErrorFilter" value="false" />
        <add key="elmah.mvc.requiresAuthentication" value="true" />
        <add key="elmah.mvc.IgnoreDefaultRoute" value="false" />
        <add key="elmah.mvc.allowedRoles" value="Administrator" />
        <add key="elmah.mvc.allowedUsers" value="*" />
        <add key="elmah.mvc.route" value="elmah" />
    </appSettings>
    ...
    <httpModules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules>
    ...
    <modules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    ...
    <elmah>
    </elmah>
    

    По умолчанию логи сохраняются в памяти. Чтобы сохранять в файл нужно установить

    <elmah>
        <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/elmah" />
    </elmah>
    

    Внимание: слэши должны быть указаны правые. С левыми слэшами не работает.
    Информация:
    а) elmah создает для каждой ошибки xml файл
    б) Чтобы записать кастомное сообщение в elmah log нужно писать так

    Elmah.ErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Elmah.Error(new Exception(str)));
    

    в) Чтобы разрешить доступ для просмотра логов, нужно установить такие параметры

    <appSettings>
        <add key="elmah.mvc.requiresAuthentication" value="true" />
        <add key="elmah.mvc.allowedRoles" value="Administrator" />
        <add key="elmah.mvc.allowedUsers" value="*" />
    </appSettings>
    ...
    <elmah>
        <security allowRemoteAccess="1"/>
    </elmah>
    
  3. устанавливаем nlog при помощи nuget и прописываем строки в Web.config:
    <configuration>
        <configSections>
            <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
        </configSections>
        ...
        <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <targets>
                <target name="logfile" xsi:type="File" fileName="${basedir}/App_Data/log.txt" />
            </targets>
            <rules>
                <logger name="*" minlevel="Info" writeTo="logfile" />
            </rules>
        </nlog>
    </configuration>
    

    Внимание: вместо ~/ нужно писать ${basedir}/
    Информация:
    а) чтобы написать сообщение в лог — создаем свойство:

    private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();
    

    и пишем сообщения так:

    _logger.Info("Application Start");
    

    б) меняем конфиг чтобы писать сообщения по группам и датам

    <nlog autoReload="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <variable name="logDirectory" value="${basedir}/App_Data/nlog/${shortdate}" />
        <targets>
            <target name="fileLogTrace" xsi:type="File" fileName="${logDirectory}/trace.txt" />
            <target name="fileLogDebug" xsi:type="File" fileName="${logDirectory}/debug.txt" />
            <target name="fileLogInfo" xsi:type="File" fileName="${logDirectory}/info.txt" />
            <target name="fileLogErrors" xsi:type="File" fileName="${logDirectory}/errors.txt" />
        </targets>
        <rules>
            <logger name="*" level="Trace" writeTo="fileLogTrace" />
            <logger name="*" level="Debug" writeTo="fileLogDebug" />
            <logger name="*" level="Info" writeTo="fileLogInfo" />
            <logger name="*" minlevel="Warn" writeTo="fileLogErrors" />
        </rules>
    </nlog>
    

Ссылки:

По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *