Тело запроса журнала IIS / данные POST


Ответы:


32

Журналы IIS записывают только строку запроса и информацию заголовка без каких-либо данных POST.

Если вы используете IIS7, вы можете включить отслеживание неуспешных запросов для кода состояния 200. При этом будут записаны все данные, и вы сможете выбрать, какой тип данных включить.

В IIS6 или 7 вы можете использовать Application_BeginRequest в global.asax и создать собственную запись данных POST.

Или, в IIS7, вы можете написать модуль HTTP с собственной регистрацией.


+1 - мне нравится твой ответ гораздо лучше, чем мой собственный. Мне явно нужно прочитать о сбое отслеживания запросов, поскольку я, очевидно, не использовал IIS7 так часто, как должен.
Эван Андерсон

Как вы можете «выбрать, какой тип данных включить»?
Павел Чучува

1
Последний шаг мастера при создании правила FRT позволяет выбрать, какие данные включать. По умолчанию все включено.
Скотт Форсайт - MVP

Я искал что-то для IIS6, но наткнулся на эту ссылку, которая показывает, что расширенное ведение журнала является дополнительным вариантом для IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas

Не похоже (из этого URL, который поделился Andyknas), что «расширенная регистрация» IIS регистрирует сообщения. Он предлагает вариант для «протоколирования клиента», которая будет войти сообщения определенного вида, но не все сообщения формы, которые ОП кажется быть с просьбой (и мне было интересно , о, я.)
чарли arehart

8

В управляемом коде вы можете использовать метод Response.AppendToLog. Этот метод добавляет данные в поле cs-uri-stem - общая длина составляет до 4100 символов (недокументировано). Если вы превысите этот предел, то значение, которое было бы зарегистрировано, будет заменено на «...»

Например, добавление чего-то вроде этого в файл Global.asax должно помочь (C #):

void Application_EndRequest(Object Sender, EventArgs e)
{
    if( "POST" == Request.HttpMethod )
    {
        byte[] bytes    = Request.BinaryRead(Request.TotalBytes);
        string s    = Encoding.UTF8.GetString(bytes);
        if (!String.IsNullOrEmpty(s))
        {
            int QueryStringLength = 0;
            if (0 < Request.QueryString.Count)
            {
                QueryStringLength = Request.ServerVariables["QUERY_STRING"].Length;
                Response.AppendToLog( "&" );
            }

            if (4100 > ( QueryStringLength + s.Length ) )
            {
                Response.AppendToLog(s);
            }
            else
            {
                // append only the first 4090 the limit is a total of 4100 char.
                Response.AppendToLog(s.Substring(0, ( 4090 - QueryStringLength )));
                // indicate buffer exceeded
                Response.AppendToLog("|||...|||");
                // TODO: if s.Length >; 4000 then log to separate file
            }
        }       
    }
}
 

1
На момент написания этого комментария ограничение составляет не 4100, а 4 КБ, что составляет 4096. Поэтому этот код необходимо немного изменить, чтобы правильно регистрировать данные POST> 4 КБ.
Стивен V

1
Мне пришлось добавить HttpContext.Current.Request.InputStream.Position = 0; перед request.BinaryRead, в противном случае он вернул бы пустой массив
alex440

3

Хотя я понимаю, что это старый вопрос, я обнаружил, что этот код дал мне именно то, что мне нужно, текстовый файл с полными заголовками запроса и ответом, поместил его в ваш global.asax.cs:

protected void Application_BeginRequest(Object Sender, EventArgs e)
{
    string uniqueid = DateTime.Now.Ticks.ToString();
    string logfile = String.Format("C:\\path\\to\\folder\\requests\\{0}.txt", uniqueid);
    Request.SaveAs(logfile, true);
}

Это создаст текстовый файл для каждого запроса (включая изображения), поэтому будьте осторожны, когда вы его используете. Я только использовал это, чтобы зарегистрировать определенные почтовые запросы.


1

Попробуйте это в своем файле web.config, чтобы отследить все

<tracing>
  <traceFailedRequests>
    <remove path="*" />
    <add path="*">
      <traceAreas>
        <add provider="ASP" verbosity="Verbose" />
        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
        <add provider="ISAPI Extension" verbosity="Verbose" />
        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI,WebSocket,Rewrite" verbosity="Verbose" />
      </traceAreas>
      <failureDefinitions timeTaken="00:00:00" statusCodes="200-999" />
    </add>
  </traceFailedRequests>
</tracing>

Но обратите внимание, что функция FRT неявно ограничивает количество файлов журнала, которые она создает (что хорошо), поэтому вам нужно будет изменить это либо в пользовательском интерфейсе, либо через записи файла конфигурации - и с должной осторожностью относитесь к объему журналы, которые будут созданы даже в скромном веб-приложении.
Чарли Арехарт

0

Это выглядит обнадеживающе, хотя я еще не пробовал:

https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log

Чем это отличается от другого варианта, предлагаемого здесь, с кодом в global.asax.cs? Это будет работать только для запросов страниц ASP.NET, а не для других страниц, которые может обрабатывать IIS (php, cgi, jsp, cfml). Ссылка, которой я поделился, - это модуль, который можно включить в IIS для любого сайта (или на уровне сервера) для обработки любого типа запроса.


-4

Попробуйте включить следующее в настройках журнала IIS:

Метод (CS-метод)

URI Stem (cs-uri-stem)

URI-запрос (cs-uri-query)


Я пробовал, не помогло ... :(
Budda

3
Эти настройки не будут включать данные POST
грабить
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.