Что такое код asp logfiledirectory


Что такое ASP?

Относительно недавно на смену статическим веб-страницам стали приходить динамические — то есть страницы, содержимое которых формируется в зависимости от действия пользователя. Соответственно, потребовался и новый класс приложений, способных формировать такие страницы. Эти приложения получили название серверов веб-приложений.

В начале 1997 года компания Microsoft выпустила 3-ю версию своего веб-сервера (Internet Information Server или IIS), в котором был реализован принципиально новый метод написания серверных приложений. Он получил название ASP (Active Server Pages — активные серверные страницы). Метод является функциональным расширением веб-сервера Microsoft и основан на использовании программных интерфейсов сервера.

По сути ASP — это обычные текстовые файлы (обычно с расширением имени asp), содержащие конструкции языка HTML и сценарии, написанные на языках JScript и/или VBScript, выполняющиеся на сервере наряду с обычным HTML-кодом.

Чем же хороша технология ASP? Прежде всего, возможностью исполнять сценарии на сервере. С помощью сценариев для сервера можно получить доступ к файлам, базам данных и другим ресурсам, хранимым на сервере, а также к централизованным ресурсам сервера, таким как электронная почта или факс-служба.

Функционирование в непротиворечивой и управляемой среде — еще одно преимущество выполнения сценариев на сервере. Ваш код выполняется только на одной версии единственного сервера, а не на множестве версий множества браузеров. Тем самым достигается так называемая кросс-платформенная совместимость.

Сценарии, расположенные в страницах ASP, могут быть не только серверными, но и клиентскими. Серверные сценарии выделяются специальным образом и исполняются на сервере, в то время как клиентские сценарии загружаются вместе с HTML-страницей на компьютер пользователя и работают под управлением браузера, не имея возможности выполнять какие-либо деструктивные функции на стороне клиента.

доступ к БД из ASP кода

Как получить доступ к БД (SQL Server) из ASP кода?

Например, код обычного VB риложения для этого выглядит так:

Как сделать тоже самое из ASP? Например, получить страницу со списком всех значений поля ‘fld1’ таблицы main?

Меню пользователя study
09.07.2009, 16:47

Как передать данные из ASP-кода в asp-страницу?
У меня есть asp-страница, которая получает с другой страницы данные, обрабатывает их и переходит (с.

Аналог следующего кода ASP в ASP.NET
Народ, есть какой нибудь аналог этого кода ASP в ASP.NET, (как с помощью DataSet изобразить тоже.

Доступ к данным по ip на ASP
Подскажите пожалуйста. Как сделать на ASP, чтобы проверив IP-адрес клиента народ из внутренней сети.

Доступ из COM к namespase исполняемого ASP
Не подскажет ли кто объект для получения доступа из COM-объекта к объектам создаваемым в.

Доступ к клиентскому сценарию из ASP
Может кто знает как получить доступ из ASP к элементам клиентского сценария.Скажем у меня есть.

Логгирование

Ведение лога и ILogger

ASP.NET Core имеет встроенную поддержку логгирования, что позволяет применять логгирование с минимальными вкраплениями кода в функционал приложения.

Для логгирования данных нам необходим объект ILogger . По умолчанию среда ASP NET Core через механизм внедрения зависимостей уже предоставляет нам такой объект. Например, возьмем стандартный проект по типу Empty и добавим механизм логгирования. Для этого перейдем к классу Startup и изменим его метод Configure() :

Средой выполнения в метод Configure передается объект ILogger, который представляет логгер. А метод логгера logger.LogInformation передает на консоль некоторую информацию. По умолчанию информация логгируется на консоль, поэтому для тестирования логгера нам надо запустить приложение как консольное:

При обращении к приложению с помощью следующего запроса http://localhost:xxxxx/index на консоль будет выведена информация, переданная логгером:

Важно, что, если мы используем класс Startup для логгирования, то получить объект логгера мы можем только в методе Configure() , но никак не в методе ConfigureServices() или конструкторе класса Startup, поскольку инфраструктура логгирования зависит от конфигурации и контейнера DI, который окончательно устанавливаются лишь после завершения работы метода ConfigureServices.

Категория логгера

В примере выше в метод передается не просто объект ILogger, а объект ILogger LogLevel . Всего мы можем использовать следующие значения:

Trace : используется для вывода наиболее детализированных сообщений. Подобные сообщения могут нести важную информацию о приложении и его строении, поэтому данный уровень лучше использовать при разработке, но никак не при публикации

Debug : для вывода информации, которая может быть полезной в процессе разработки и отладки приложения

Information : уровень сообщений, позволяющий просто отследить поток выполнения приложения

Warning : используется для вывода сообщений о неожиданных событиях, например, ошибках, которые не влияют не останавливают выполнение приложения, но в то же время должны быть иследованы

Error : информация об ошибках, вследствие которых приложение должно быть остановлено

Critical : уровень критических ошибок, которые могут быть связаны с какими-то ситуациями извне — ошибками операционной системы, потерей данных в бд, переполнение памяти диска и т.д.

None : вывод информации в лог не применяется

Для вывода соответствующего уровня информации у объекта ILogger определены соответствующие методы расширения:

Так, в примере выше для вывода информации на консоль использовался метод LogInformation() .

Вывод сообщений уровня Trace по умолчанию отключен.

Каждый такой метод имеет несколько перегрузок, которые могут принимать ряд различных параметров:

string data : строковое сообщение для лога

int eventId : числовой идентификатор, который связан с логом. Идентификатор должен быть статическим и специфическим для определенной части логгируемых событий.

string format : строковое сообщения для лога, которое моет содержать параметры

object[] args : набор параметров для строкового сообщения

Exception error : логгируемый объект исключения

Также для логгирования определен общий метод Log() , который позволяет определить уровень логгера через один из параметров:

При стандартном логгировании на консоль для каждого уровня/метода определен своя метка и цветовой маркер, которые позволяют сразу выделить сообщение соответствующего уровня. Например, при запуске следующего кода:

Что такое код asp logfiledirectory

It says Type CreateLogFiles is not defined.

But I have this on same aspx page

Please help me in solving this issue

Akhil Mittal 3-Jul-14 23:55
What about Thread Safety?
Sign In· View Thread
Thanks BBBwex 16-May-14 6:09
I’m just selfstudying, and was looking for an easy way to get my own logs for usage and errors on my website. You saved me a lot of headache. Ganapathy A 27-Aug-13 19:35
Thanks..
Sign In· View Thread
thanks good rose lindo 23-Apr-13 22:27
thanks good one
Sign In· View Thread
My vote of 2 hims056 27-Nov-12 2:11
Not much useful.
Sign In· View Thread
Thanks for Article Rajeshkumar Chavada 8-Aug-12 2:20
Thanks Ali Ahmad H

Your Article Useful for Me.

Sign In· View Thread
conversion problem

viji@sampathraj 13-Dec-11 21:08
after downloded it shows the conversion problem wt can i do.kindly reply me
Sign In· View Thread
Please wrap disposable resources (StreamWriter & Reader) in using( ) blocks Damon Overboe 26-Oct-11 5:39
Any time you use a disposable resource, those need to be wrapped in a using( ) statement.

You may have omitted that for brevity, however since people copy and paste code and your post is a relatively popular one, please update your snippet above and the source files to reflect this.

Disposable resources are those that implement IDisposable, and they may or may not expose it publicly. They use or wrap non-managed resources, such as File.IO and SQL, so .Net has no idea when you are finished with the resources; they are not freed from memory simply because they go out of scope. You can imagine what the side effects are, and they compound greatly the more times you use them but do not dispose.

So, please change your ErrorLog function to this:

The using( ) block ensures that Dispose() is called on the StreamWriter, even if an error happens to be thrown.

You need to take the same approach with the StreamReader:

This link goes into more detail as to what disposable resources are, and how to manage them:
http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx#Y114[^]

Thanks!

Sign In· View Thread
Re: Please wrap disposable resources (StreamWriter & Reader) in using( ) blocks

Ashok A 23-Apr-12 14:31
Very good suggestion.
Sign In· View Thread
Thank you! krembf 5-Sep-11 12:33
Thank for simple yet elegant solution, it works very well for me!
Sign In· View Thread
need help to access madhuri from hyd 1-Aug-11 3:22
please mention which function can write in which page and mention how to create a log file and how to access it. i understand the code but i don’t know how to execute that one please help me.
Sign In· View Thread
Re: need help to access Ali Ahmad H 1-Aug-11 17:41

The function to create the error log is created in the class «CreateLogFiles».
You can create the public class in the single file.
When you need to log the error, you have to call the class function, in my file, I call the function when a button was clicked.

hope you have clearer idea

Sign In· View Thread
Thanks

Lubna_04 19-Apr-10 17:21
very helpful article
Sign In· View Thread
Thanks! Praveen Modi 3-Apr-09 11:30
Many Thanks Dude! Your article and code was of great help.
Sign In· View Thread
Re: Thanks!

Ali Ahmad H 5-Apr-09 18:29
Glad to hear that from you.
Sign In· View Thread
Small enhancement — DirectoryNotFoundException jsytniak 27-Apr-07 22:04
public void ErrorLog(string sPathName, string sErrMsg)
<
try
<
StreamWriter sw = new StreamWriter(sPathName.Replace(«.», «.» + sErrorTime + «.»), true);
sw.WriteLine(sLogFormat + sErrMsg);
sw.Flush();
sw.Close();

>
catch (DirectoryNotFoundException ex)
<
FileInfo fi = new FileInfo(sPathName);
Directory.CreateDirectory(fi.DirectoryName);
ErrorLog(sPathName, sErrMsg);
>
>

VishalSharmaDev 6-Oct-06 0:36
hi dear

i need to create a log file for each and every request made to my application. now can u please tell me how can i do this with the help of this code.

also, please tell me that, if i, made this class and its methods static then what would be the expectations after doing that.

different log file should be written for each & every request.

please help in the matter.

a positive reponse is expected from all guys

Vishal Sharma
vishalsharma556@yahoo.co.in

RASHMIREKHA 29-Mar-06 20:23
it is not working, how to do it in global.asax,so that when an error will occur it will send mail with the detail of error
Sign In· View Thread
ERROR LOG RASHMIREKHA 29-Mar-06 20:21
it is not working, how to do it in global.asax
Sign In· View Thread
Event Log Security Exception Aanchal Naidu 16-Dec-05 15:33
Hi All,
I am getting a Security Exception while trying to write to the event log. I am logged on as an Administrator, have set the trust level to high and >
Server Error in ‘/ASP.NetProjects/EventLog’ Application.
———————————————————————————

Security Exception
Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application’s trust level in the configuration file.

Exception Details: System.Security.SecurityException: Request failed.

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Thank you,
Aanchal.

Sign In· View Thread
simple messege board

Anonymous 2-Oct-05 20:47
Please some thing about the message board and simple message.
Sign In· View Thread
Re: simple messege board Anonymous 5-Oct-05 21:48
Sign In· View Thread
Last Visit: 13-Nov-19 5:27 Last Update: 13-Nov-19 5:27 Refresh 1 2 Next »

General News Suggestion Question Bug Answer Joke Praise Rant Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Идентификация в ASP.NET

Ты, наверное как и любой программист, занимающийся разработкой web-приложений, ни раз сталкивался с проблемой несанкционированного доступа. Ведь одни сайты рассчитаны на свободный доступ для всех посетителей, другие же являются закрытыми, и доступ к ним предоставляется только отдельным пользователям. Частым решением этой проблемы является идентификация пользователя путем логина/пароля.

Базовые понятия систем безопасности

Существуют два понятия, без которых невозможно обсуждение безопасности:

  • Аутентификация (authentication) – процесс определения личности пользователя, требующий верные логин и пароль, чтобы доказать, что он на самом деле тот, за кого себя выдает.
  • Авторизация (authorization) – это процесс выставления прав пользователю, прошедшего аутентификацию.

Способы аутентификации ASP.NET

Среда ASP.NET предоставляет три способа аутентификации:

  • Windows – аутентификация на основе системы диспетчера локальной сети Windows
    NT.
  • Forms – аутентификация на основе cookies.
  • Passport – аутентификация с помощью службы Passport от
    Microsoft.

Для того, чтобы выбрать тот или иной способ аутентификации потребуется внести изменения в файл конфигурации web.config следующим образом (я выбрал метод Forms — как наиболее актуальную при разработке web-приложений):

Вы можете справедливо заметить, что после внесения показанных выше изменений ничего особенного не происходит.
Эта ситуация возникает из-за того, что мы не запретили доступ анонимным пользователям. Для
такого запрета надо внести еще одно изменение в файле
web.config:

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

После того, как вы выбрали режим аутентификации и правила авторизации, вам нужно создать страницу, которая запрашивает информацию у пользователя и решает, можно ли его аутентифицировать. Но об этом чуть позже. А пока я поясню, как мы это будем делать. Пароли и логины мы будем хранить,
например, в файле web.config. Пример того, как это сделать показан ниже:

Небольшие пояснения: параметр loginUrl в теге authentication указывает на страницу регистрации (по умолчанию – default.aspx), а параметр passwordFormat в теге credentials означает, что логин и пароль не зашифрованы (альтернативы – использовать алгоритмы шифрования SHA1 и MD5. О них мы поговорим позже ).

Для проверки верности логина и пароля будем использовать метод
FormsAuthentication. Authenticate(string login,string pass). А для регистрации пользователя в приложение ASP.NET путем создания cookie, и перенаправления на страницу, которая была изначально запрошена пользователем, будем использовать метод
FormsAuthentication. RedirectFromLoginPage(string login, bool CreatePersistentCookie) (второй параметр указывает на то,
каким будет посланный cookie – постоянный (срок годности
— 50 лет, значение true) или нет (false)).

Вот, собственно, и сам код страницы регистрации:

Авторизация на основе ролей (Roles API)

ASP.NET — Безопасность в ASP.NET — Авторизация на основе ролей (Roles API)

Платформа ASP.NET поставляется с готовой к использованию инфраструктурой для управления и применения ролей (подобной Membership API). Эта инфраструктура, будучи полностью расширяемой через механизм поставщиков, такой как у Membership API, включает встроенную функциональность для управления ролями, назначения ролей пользователям и обращения ко всей информации о ролях в коде. Если говорить более подробно, то инфраструктура ролей включает перечисленные ниже аспекты:

Основанный на поставщиках механизм включения разных типов хранилищ данных, связанных с ролями.

Готовую к использованию реализацию поставщика для SQL Server и необходимые таблицы базы данных, основанные на данных членства. Эти таблицы ассоциируют записи о пользователях с ролями посредством отношения «многие ко многим» и создаются автоматически при вызове инструмента aspnet_regsql.exe (который также рассматривался ранее).

Предварительно построенный класс RolePrincipal, автоматически инициализируемый дня аутентифицированных пользователей через RoleManagerModule (также входящий в инфраструктуру ролей).

Полный программный доступ к ролям через класс Roles.

Чтобы использовать эту инфраструктуру, первым делом ее понадобится сделать доступной. Для этого необходимо либо отметить флажок Enable Roles for This Web Site (Разрешить роли для этого веб-сайта) при работе с мастером безопасности, либо щелкнуть на ссылке Enable Roles (Разрешить роли) на вкладке Security (Безопасность) в WAT:

В обоих случаях инструмент добавляет небольшой элемент конфигурации в файл web.config приложения. Это можно сделать и вручную, равно как и включить Roles API:

После появления этой конфигурации ASP.NET автоматически создает файловую базу данных ASPNETDB.MDF в каталоге приложения App_Data. Если хотите использовать собственное хранилище, выполните следующие шаги:

Создайте хранилище данных либо с помощью aspnet_regsql.exe, либо выполнив командные сценарии T-SQL, находящиеся в каталоге .NET Framework. И то, и другое объяснялось в статье «Настройка Membership API».

Сконфигурируйте поставщика ролей для использования ранее созданного хранилища.

Сконфигурировать поставщика ролей можно с помощью дескриптора . Можно либо использовать другую базу данных, либо полностью другое хранилище. Вдобавок посредством дескриптора можно настроить некоторые свойства, которые не могут быть сконфигурированы в среде WAT:

После добавления этого элемента конфигурации в файл web.config можно выбрать поставщика через WAT. Для этого нужно просто перейти в панель Provider (Поставщик) и щелкнуть на ссылке Select a Different Provider for Each Feature (Выбрать отдельного поставщика для каждой функции). Выбор поставщика в WAT показан на рисунке ниже:

В таблице ниже перечислены свойства, которые можно конфигурировать с помощью дескриптора :

Свойства конфигурации

Указывает, включен интерфейс Roles API (true) или нет (false)

Необязательный атрибут, указывающий текущего активного поставщика для хранения информации о ролях. Если вы используете другого поставщика, то должны сконфигурировать его и установить значение атрибута defaultProvider равным имени необходимого поставщика

Вместо чтения ролей каждый раз из хранилища их можно сохранить в cookie-наборе. Этот атрибут указывает, используется ли cookie-набор

Если роли кэшируются в cookie-наборе, в этом атрибуте можно указать имя cookie-набора

Указывает корневой путь cookie-набора, где кэшируются роли для приложения. Это позволяет указать часть приложения, для которого cookie-набор действителен. Значение по умолчанию — /

Cookie-набор с ролями может быть зашифрован и подписан. В этом атрибуте указывается уровень защиты. Допустимые значения: All (шифровать и подписывать), Encryption, Validation и None

Указывает, должен ли cookie-набор возвращаться ASP.NET только в случае включенного SSL (true) или в любом другом случае (false). Если атрибут установлен в true, a SSL не активизирован, исполняющая среда просто не возвращает cookie-набор, а потому проверка ролей всегда осуществляется через лежащий в основе поставщик ролей

Получает или устанавливает таймаут для cookie-набора ролей в минутах. По умолчанию составляет 30 минут

Указывает, должен таймаут cookie-набора расширяться при каждом запросе пользователя к приложению ASP.NET (true) или нет (false). Значение по умолчанию — true


Если установлено в true, cookie-набор постоянно сохраняется на клиентской машине. В противном случае cookie-набор существует только в течение сеанса и удаляется, когда пользователь закрывает браузер

Указывает допустимый домен для cookie-набора ролей

Указывает максимальное количество имен ролей в cookie-наборе

В предыдущем примере конфигурировался поставщик SqlRoleProvider. Этот поставщик включает несколько дополнительных настроек, которые можно устанавливать в файле web.config. Все они перечислены в таблице ниже:

Свойство Описание
enabled
defaultProvider
cacheRolesInCookie
cookieName
cookiePath
cookieProtection
cookieRequireSSL
cookieTimeout
cookieSlidingExpiration
createPersistentCookie
maxCachedResults
Дополнительные свойства SqlRoleProvider

Имя поставщика. Это имя может быть использовано в атрибуте defaultProvider, описанном в предыдущей таблице, для указания поставщика для приложения

Имя приложения, для которого выполняется управление ролями

Краткое дружественное описание поставщика

Имя строки соединения, указанной в разделе файла web.config, которая будет использоваться для подключения к хранилищу ролей

В дополнение к SqlRoleProvider платформа ASP.NET содержит поставщик, который может быть использован на Windows Server 2003 с помощью диспетчера авторизации (Authorization Manager). Как будет показано позже, можно также создать и применять собственные специальные поставщики. В таблице ниже перечислены основные классы, входящие в Roles API:

Свойство Описание
name
applicationName
description
connectionStringName
Основные классы Roles API

Этот модуль гарантирует, что роли будут назначены текущему зарегистрированному пользователю при каждом запросе. Он прикрепляется к событию Application _AuthenticateRequest и создает экземпляр RolePrincipal, который содержит роли, назначенные пользователю, если Roles API разрешен в web.config

Базовый класс для каждого поставщика ролей, определяющий интерфейс, который следует реализовать в каждом RoleProvider. Каждый пользовательский поставщик ролей должен быть унаследован от этого класса

Коллекция поставщиков ролей. Эта коллекция позволяет выполнять итерацию по всем сконфигурированным поставщикам ролей в системе и для приложения, что полезно при написании административного приложения или отдельных страниц

Реализация поставщика ролей для баз данных SQL Server

Получает информацию о ролях для аутентифицированного пользователя Windows на основе групповых ассоциаций Windows

Реализация поставщика ролей для сохранения ролей в хранилище на основе диспетчера авторизации (Authorization Manager). Диспетчер Authorization Manager входит в состав Windows Server 2003 и позволяет декларативно определять роли приложений и привилегии этих ролей. Разрабатываемое приложение может использовать Authorization Manager для программной авторизации пользователей

Класс Roles служит первичным интерфейсом к хранилищу ролей. Этот класс включает методы для программного управления ролями

Реализация IPrincipal, которая подключается к сконфигурированным ролям с аутентифицированным пользователем. Создается автоматически модулем RoleManagerModule, если интерфейс Roles API разрешен

После конфигурирования Roles API можно создавать пользователей и роли, а затем назначать пользователей на эти роли с помощью либо WAT, либо класса Roles в коде. На вкладке Security (Безопасность) в WAT щелкните на ссылке Create or Manage Rotes (Создание ролей и управление ими). После этого можно будет создавать роли, а также добавлять к ним пользователей:

Когда включен Roles API, модуль RoleManagerModule автоматически создает экземпляр RolePrincipal, содержащий как идентичность аутентифицированного пользователя, так и его роли. RolePrincipal — это просто специальная реализация IPrincipal, базового интерфейса для всех классов принципалов. Поэтому он поддерживает функциональность по умолчанию, такую как доступ к аутентифицированной идентичности и метод для верификации условий членства в ролях через метод IsInRole().

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

Использование элемента управления LoginView с ролями

Ранее вы ознакомились с подробностями об элементах управления безопасностью, поставляемых в составе ASP.NET. Одним из них был элемент LoginView. В статье, приведенной по ссылке, он применялся для отображения различных элементов управления для анонимных и зарегистрированных пользователей. Для реализации своей функциональности этот элемент управления использует шаблоны — и .

Этот элемент управления поддерживает один дополнительный шаблон, позволяющий строить различные представления на основе ролей, к которым принадлежит пользователь. Для этой цели потребуется добавить шаблон RoleGroup с элементами управления . Внутри каждого элемента в свойстве Roles указывается разделенный запятыми список ролей, для которых будет отображаться соответствующий шаблон :

Элемент управления LoginView в приведенном коде отображает различное содержимое для зарегистрированных пользователей и для пользователей, назначенных на специфические роли. Например, для пользователей в роли Admin он отображает текст «Только для админов», в то время как для пользователей из роли Guest выводится текст «Увидят только гости». LoggedInTemplate будет отображаться только для аутентифицированных пользователей без соответствующего элемента . Как только подходящая группа ролей для пользователя найдена, содержимое LoggedInTemplate не отображается.

Программный доступ к ролям

Как и в случае с интерфейсом Membership API интерфейс Roles API позволяет выполнять все задачи непосредственно в коде. Можно программно добавлять новые роли, читать информацию о ролях и удалять их из приложения. Более того, можно ассоциировать пользователей с ролями, а также извлекать пользователей, ассоциированных с определенной ролью. Все это делается с помощью методов класса Roles.

Большинство свойств класса Roles просто отображаются на настройки дескриптора , описанные выше. Поэтому в таблице ниже перечислены только дополнительные свойства и методы класса Roles, которые можно использовать для программного доступа и управления Roles API:

Класс Описание
RoleManagerModule
RoleProvider
RoleProviderCollection
SqlRoleProvider
WindowsTokenRoleProvider
AuthorizationStoreRoleProvider
RolePrincipal
Члены класса Roles

Возвращает поставщика, в данный момент используемого приложением

Возвращает коллекцию всех доступных для приложения поставщиков в системе. То есть возвращаются поставщики, сконфигурированные в файлах machine.config и web.config приложения

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

Принимает имя пользователя как строковый параметр и имена ролей как массив строк, после чего добавляет указанного пользователя ко всем указанным ролям

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

Принимает строковый массив с именами пользователей и второй — с именами ролей, после чего добавляет всех указанных пользователей во все указанные роли

Создает новую роль

Удаляет существующую роль

Принимает строку, представляющую имя роли, и вторую строку, указывающую шаблон соответствия имен пользователей. Возвращает список пользователей, ассоциированных с ролью и соответствующих шаблону — второму параметру метода (usernameToMach)

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

Возвращает строковый массив, содержащий все роли, с которыми ассоциирован указанный пользователь. Есть также версия без параметров, которая извлекает роли текущего зарегистрированного пользователя

Возвращает список пользователей, которые ассоциированы с ролью, переданной в параметре

Возвращает true, если указанный пользователь является членом указанной роли

Удаляет отдельного пользователя из роли

Удаляет пользователя из всех указанных ролей

Удаляет всех указанных пользователей из одной указанной роли

Удаляет всех указанных пользователей из всех указанных ролей


Возвращает true, если роль существует, и false в противном случае

Удачным применением программного доступа к ролям является автоматическое ассоциирование пользователей с ролями при их самостоятельной первичной регистрации. Конечно, это удобно только для определенных ролей. Предположим, что приложение поддерживает роль под названием User, и каждый индивидуальный пользователь должен быть членом этой роли. Если вы регистрируете пользователя сами, то можете установить это отношение вручную. Но если приложение поддерживает автоматическую регистрацию для пользователей из Интернета, это делать нельзя. Поэтому нужно как-то обеспечивать автоматическую ассоциацию каждого пользователя с ролью User.

В качестве первой попытки можно решить перехватывать событие CreatedUser элемента управления CreateUserWizard, но этого недостаточно. Вспомните о существовании инструмента ASP.NET WAT, в котором можно создавать пользователей. В этом случае перехват события CreatedUser элемента управления, помещенного в ваше приложение, не поможет. Понадобится найти другое решение.

Определенно, для этой цели потребуется событие уровня приложения, хотя оно и не будет инициировано приложением конфигурации, поскольку это — другое приложение. Остается только перехват события Application. AuthenticateRequest — внутри этого события можно проверить, является ли пользователь членом роли User. Если нет, пользователь может быть добавлен автоматически. Это смещает задачу автоматического добавления пользователя к роли в точку аутентификации, которая по определению касается каждого пользователя. Чтобы сделать это, необходимо добавить в проект глобальный класс приложения (global.asax) и поместить в него приведенный ниже код:

Поступать подобным образом следует только с низкопривилегированными ролями, такими как User. Будет очень плохой идеей выполнять аналогичное действие с ролями другого типа.

Корректный ASP.NET Core

Специально для любителей книг из серии «С++ за 24 часа» решил написать статью про ASP.NET Core.

Если вы раньше не разрабатывали под .NET или под какую-то аналогичную платформу, то смысла заходить под кат для вас нет. А вот если вам интересно узнать что такое IoC, DI, DIP, Interseptors, Middleware, Filters (то есть все то, чем отличается Core от классического .NET), то вам определенно есть смысл нажать на «Читать дальше», так как заниматься разработкой без понимания всего этого явно не корректно.

IoC, DI, DIP

Если театр начинается с вешалки, то ASP.NET Core начинается с Dependency Injection. Для того, чтобы разобраться с DI нужно понять, что такое IoC.

Говоря о IoC очень часто вспоминают голливудский принцип «Don’t call us, we’ll call you». Что означает «Не нужно звонить нам мы позвоним вам сами».

Различные источники приводят различные паттерны, к которым может быть применен IoC. И скорее всего они все правы и просто дополняют друг друга. Вот некоторые их этих паттернов: factory, service locator, template method, observer, strategy.

Давайте разберем IoC на примере простого консольного приложения.

Допустим у нас есть два простых класса, реализующих интерфейс с одним методом:

Они оба зависят от абстракции (в данном случае в виде абстракции выступает интерфейс).

И, допустим, у нас есть объект более высокого уровня, использующий эти классы:

В зависимости от параметра конструктора переменная _instance инициализируется определенным классом. Ну и далее при вызове Write будет совершен вывод на консоль или в Debug. Все вроде бы неплохо и даже, казалось бы, соответствует первой части принципа Dependency Inversion

Объекты более высокого уровня не зависят от объектов более низкого уровня. И те, и те зависят от абстракций.

В качестве абстракции в нашем случае выступает ILayer.

Но у нас должен быть еще и объект еще более высокого уровня. Тот, который использует класс Logging

Инициализируя Logging с помощью 1 мы получаем в классе Logging экземпляр класса, выводящего данные на консоль. Если мы инициализируем Logging любым другим числом, то log.Write будет выводить данные в Debug. Все, казалось бы, работает, но работает плохо. Наш объект более высокого уровня Main зависит от деталей кода объекта более низкого уровня – класса Logging. Если мы в этом классе что-то изменим, то нам необходимо будет изменять и код класса Main. Чтобы это не происходило мы сделаем инверсию контроля – Inversion of Control. Сделаем так чтобы класс Main контролировал то, что происходит в классе Logging. Класс Logging будет получать в виде параметра конструктора экземпляр класса, реализующего интерфейс интерфейс ILayer

И теперь нас класс Main будет выглядеть таким образом:

Фактически мы декорируем наш объект Logging с помощью необходимого для нас объекта.

Теперь наше приложение соответствует и второй части принципа Dependency Inversion:

Абстракции не зависят от деталей. Детали зависят от абстракций. Т.е. мы не знаем деталей того, что происходит в классе Logging, мы просто передаем туда класс, реализующий необходимую абстракцию.

Есть такой термин tight coupling – тесная связь. Чем слабее связи между компонентами в приложении, тем лучше. Хотелось бы заметить, что данный пример простого приложения немного не дотягивает до идеала. Почему? Да потому что в классе самого высокого уровня в Main у нас дважды используется создание экземпляров класса с помощью new. А есть такая мнемоническая фраза «New is a clue» — что означает чем меньше вы используется new, тем меньше тесных связей компонентов в приложении и тем лучше. В идеале мы не должны были использовать new DebugLayer, а должны были получить DebugLayer каким-нибудь другим способом. Каким? Например, из IoC контейнера или с помощью рефлексии из параметра передаваемого Main.

Теперь мы разобрались с тем, что такое Inversion of Control (IoC) и что такое принцип Dependency Inversion (DIP). Осталось разобраться с тем, что такое Dependency Injection (DI). IoC представляет собой парадигму дизайна. Dependency Injection это паттерн. Это то, что у нас теперь происходит в конструкторе класса Logging. Мы получаем экземпляр определенной зависимости (dependency). Класс Logging зависит от экземпляра класса, реализующего ILayer. И это экземпляр внедряется (injected) через конструктор.

IoC container

IoC контейнер это такой объект, который содержит в себе множество каких-то определенных зависимостей (dependency). Зависимость можно иначе назвать сервисом – как правило это класс с определенным функционалом. При необходимости из контейнера можно получить зависимость необходимого типа. Внедрение dependency в контейнер — это Inject. Извлечение – Resolve. Приведу пример самого простого самостоятельно написанного IoC контейнера:

Всего дюжина строчек кода, а уже можно использовать (не в продакшн, разумеется, а в учебных целях).

Зарегистрировать зависимость (допустим, ConsoleLayer или DebugLayer которые мы использовали в прошлом примере) можно так:

А извлечь из контейнера в необходимом месте программы так:

В реальных контейнерах еще реализуется и Dispose(), позволяющий уничтожать ставшие ненужными ресурсы.

Кстати, имя IoC контейнер не совсем точно передает смысл, так как термин IoC гораздо шире по применению. Поэтому в последнее время все чаще применяется термин DI контейнер (так как все-таки применяется dependency injection).

Service lifetimes + various extension methods in Composition Root

Приложения ASP.NET Core содержат файл Startup.cs который является отправной точкой приложения, позволяющей настроить DI. Настраивается DI в методе ConfigureServices.

Этот код добавит в DI контейнер класс SomeRepository, реализующий интерфейс ISomeRepository. То, что сервис добавлен в контейнер с помощью AddScoped означает, что экземпляр класса будет создаваться при каждом запросе страницы.
Добавить сервис в контейнер можно и без указания интерфейса.

Но такой способ не рекомендуется, так как у вашего приложения теряется гибкость и появляются тесные связи. Рекомендуется всегда указывать интерфейс, так как в таком случае в любой момент времени можно заменить одну реализацию интерфейса другой. И если реализации поддерживают принцип Liskov substitution, то «легким движением руки» сменив название класса реализации вы измените и функционал всего приложения.

Есть еще 2 варианта добавить сервис – AddSingleton и AddTransient.
При использовании AddSingleton сервис создается один раз и при использовании приложения обращение идет к одному и тому же экземпляру. Использовать этот способ нужно особенно осторожно, так как возможны утечки памяти и проблемы с многопоточностью.

У AddSingleton есть небольшая особенность. Он может быть инициализирован либо при первом обращении к нему

либо сразу же при добавлении в конструктор

Вторым способом можно даже добавить параметр в конструктор.
Если хочется добавить параметр в конструктор сервиса, добавленного не только с помощью AddSingleton, но и с помощью AddTransient/AddScoped, то можно использовать лямбда выражение:

Ну и наконец, при использовании AddTransient сервис создается каждый раз при обращении к нему. Отлично подходит для легких сервисов, не потребляющих память и ресурсы.

Если с AddSingleton и AddScoped все должно быть более-менее понятно, то AddTransient требует разъяснений. Официальная документация приводит пример, в котором определенный сервис добавлен в DI контейнер и в качестве параметра конструктора другого сервиса и отдельно самостоятельно. И вот в случае, если он добавлен отдельно с помощью AddTransient, он создает свой экземпляр 2 раза. Приведу очень-очень упрощенный пример. В реальной жизни к применению не рекомендуется, т.к. классы для упрощения не наследуют интерфейсы. Допустим у нас есть простой класс:

И есть второй класс, который содержит первый как зависимый сервис и получает эту зависимость в качестве параметра конструктора:

Теперь совершаем inject двух сервисов:

И в каком-нибудь контроллере в Action добавим получение наших зависимостей и вывод значений в окно Debug.

Так вот в результате мы получим 2 разных значения Guid. А вот если мы заменим AddTransient на AddScoped, то в результате мы получим 2 одинаковых значения.

В IoC контейнере приложений ASP.NET Core по умолчанию содержатся уже некоторые сервисы. Например, IConfiguration – сервис с помощью которого можно получить настройки приложения из файлов appsettings.json и appsettings.Development.json. IHostingEnvironment и ILoggerFactory с помощью которых можно получить текущую конфигурацию и вспомогательный класс, позволяющий проводить логирование.

Извлекают классы из контейнера с помощью следующей типичной конструкции (самый банальный пример):

В области видимости контроллера создается переменная с модификаторами доступа private readonly. Зависимость получается из контейнера в конструкторе класса и присваивается приватной переменной. Далее эту переменную можно использовать в любых методах или Action контроллера.
Иногда не хочется создавать переменную для того, чтобы использовать ее только в одном Action. Тогда можно использовать атрибут [FromServices]. Пример:

Выглядит странно, но для того, чтобы в коде не вызывать метод статического класса DateTime.Now() иногда делают так, что значение времени получается из сервиса в качестве параметра. Таким образом появляется возможность передать любое время в качестве параметра, а значит становится легче писать тесты и, как правило, становится проще вносить изменения в приложение.
Нельзя сказать, что static – это зло. Статические методы выполняются быстрее. И скорее всего static может использоваться где-то в самом IoC контейнере. Но если мы избавим наше приложение от всего статического и new, то получим большую гибкость.

Сторонние DI контейнеры

То, что мы рассматривали и то, что фактически реализует ASP.NET Core DI контейнер по умолчанию, — constructor injection. Имеется еще возможность внедрить зависимость в property с помощью так называемого property injection, но эта возможность отсутствует у встроенного в ASP.NET Core контейнера. Например, у нас может быть какой-то класс, который вы внедряем как зависимость, и у этого класса есть какое-то public property. Теперь представьте себе, что во время или после того как мы внедряем зависимость, нам нужно задать значение property. Вернемся к примеру похожему на пример, который мы недавно рассматривали.
Если у нас есть такой вот класс:

который мы можем внедрить как зависимость,

то используя стандартный контейнер задать значение для свойства мы не можем.
Если вы захотите использовать такую возможность задать значение для свойства OperationId, то вы можете использовать какой-то сторонний DI контейнер, поддерживающий property injection. К слову сказать property injection не особо рекомендуется использовать. Однако, существуют еще Method Injection и Setter Method Injection, которые вполне могут вам пригодится и которые также не поддерживаются стандартным контейнером.

У сторонних контейнеров могут быть и другие очень полезные возможности. Например, с помощью стороннего контейнера можно внедрять зависимость только в контролеры, у которых в названии присутствует определенное слово. И довольно часто используемый кейс – DI контейнеры, оптимизированные на быстродействие.
Вот список некоторых сторонних DI контейнеров, поддерживаемых ASP.NET Core: Autofac, Castle Windsor, LightInject, DryIoC, StructureMap, Unity

Хоть при использовании стандартного DI контейнера и нельзя использовать property/method injection, но зато можно внедрить зависимый сервис в качестве параметра конструктора реализовав паттерн «Фабрика» следующим образом:

В данном случае GetService вернет null если зависимый сервис не найден. Есть вариация GetRequiredService, которая выбросит исключение в случае, если зависимый сервис не найден.
Процесс получения зависимого сервиса с помощью GetService фактически применяет паттерн Service locator.

Autofac

Разберем Autofac на практическом примере. Удобно то, что сервисы из контейнера можно будет регистрировать и получать, как и дефолтным способом, так и с помощью Autofac.

Установим NuGet пакет Autofac.Extensions.DependencyInjection.
Изменим возвращаемое методом ConfigureServices значение с void на IServiceProvider. И добавим property

После этого станет возможным добавить в конец метода ConfigureServices класса Startup код вроде следующего (это лишь один из вариантов регистрации сервисов):

Здесь builder.Populate(services); добавляет в контейнер сервисы из IServiceCollection. Ну и далее уже можно регистрировать сервисы с помощью builder.RegisterType. Ах, да. Чуть не забыл. Необходимо изменить с void на IServiceProvider возвращаемое значение метода ConfigureServices.

AOP с помощью ASP.NET Core — Autofac Interseptors

Говоря про аспектно-ориентированное программирование, упоминают другой термин – cross-cutting concerns. Concern – это какая-то часть информации, которая влияет на код. В русском варианте употребляют слово ответственность. Ну а cross-cutting concerns это ответственности, которые влияют на другие ответственности. А в идеале ведь они не должны влиять друг на друга, так ведь? Когда они влияют на друг друга, то становится сложнее изменять программу. Удобнее, когда у нас все операции происходят по отдельности. Логирование, транзакции, кеширование и многое другое можно совершать с помощью AOP не изменяя код самих классов и методов.

В мире .NET часто применяется способ, когда AOP код внедряется с помощью пост-процессора в уже откомпилированный код приложения (PostSharp) Или же альтернативно можно применять интерцепторы – это такие перехватчики событий, которые можно добавлять в код приложения. Эти перехватчики, как правило, используют для своей работы уже рассмотренный нами паттерн декоратор.

Давайте создадим свой интерцептор. Самый простой и типичный пример, который проще всего воспроизвести — это логирование.
Установим дополнительно к пакету Autofac.Extensions.DependencyInjection еще и пакет Autofac.Extras.DynamicProxy
Установили? Добавим простенький класс лога, который будет вызываться при обращении к определенным сервисам.

Добавляем в нашу регистрацию Autofac регистрацию интерцептора:

И теперь при каждом обращении к классу будет вызван метод Intercept класса Logger.
Таким образом мы можем упростить себе жизнь и не писать в начале каждого метода запись в лог. Она у нас будет вестись автоматически. И при желании нам будет несложно ее изменить или отключить для всего приложения.

Также мы можем убрать .InterceptedBy(typeof(Logger)); и добавить перехват вызовов только для конкретных сервисов приложения с помощью атрибута [Intercept(typeof(Logger))] – необходимо указать его перед заголовком класса.

Middleware

В ASP.NET существует определенная цепочка вызовов кода, которая происходит при каждом request. Еще до того, как загрузился UI/MVC выполняются определенные действия.

То есть, например, если мы добавим в начало метода Configure класса Startup.cs код


то мы сможем посмотреть в консоли дебага какие файлы запрашивает наше приложение. Фактически мы получаем возможности AOP “out of box”
Немного useless, но понятный и познавательный пример использования middleware я вам сейчас покажу:

При каждом запросе начинает выполнятся цепочка вызовов. Из каждого app.Use после вызова next.invoke() совершается переход ко следующему вызову. И все завершается после того как отработает app.Run.
Можно выполнять какой-то код только при обращении к определенному route.
Сделать это можно с помощью app.Map:

Теперь если просто перейти на страницу сайта, то можно будет увидеть текст “Hello!”, а если добавить к строке адреса /Goodbye, то вам будет отображено Goodbye.

Кроме Use и Map можно использовать UseWhen или MapWhen для того, чтобы добавлять код в цепочку middleware только при каких-то определенных условиях.

До сих пор были все еще useless примеры, правда? Вот вам нормальный пример:

Здесь мы добавляем к каждому запросу заголовки, помогающие обезопасить страницу от хакерских атак.

Или же вот пример локализации:

Теперь если вы к адресу страницы добавите параметр ?culture=fr то вы сможете переключить язык приложения на французский (если в ваше приложение добавлена локализация, то все сработает)

Filters

Если цепочка middleware относятся к процессам до MVC, то фильтры работают вместе с MVC.
Следующее схематическое изображение показывает, как отрабатывают фильтры

Сначала отрабатывают фильтры авторизации. Т.е. можно создать какой-то фильтр или несколько фильтров и вписать в них какой-то свой код авторизации, который будет отрабатывать при запросах.

Затем отрабатывают фильтры ресурсов. С помощью этих фильтров можно, например, вернуть какую-то информацию из кеша.

Затем происходит привязка данных и выполняются Action фильтры. С их помощью можно манипулировать параметрами передаваемыми Action и возвращаемым результатом.

Exception фильтры как намекает название позволяют добавить какую-то общую обработку ошибок для приложения. Должно быть довольно удобно обрабатывать ошибки везде одинаково. Эдакий AOP-шный плюс.

Result фильтры позволяют совершить какие-то действия до выполнения Action контроллера или после. Они довольно похожи на Action фильтры, но выполняются только в случае отсутствия ошибок. Подходят для логики завязанной на View.

Все должно быть более понятно на примере. А у меня под рукой как раз есть пример упрощенного авторизационного фильтра:

Добавляете этот класс в DI контейнер (как обычно в Startup.cs)

И теперь становится возможным добавить какую-то свою авторизацию любому Action добавив следующий атрибут

Забавная штука – можно создать свое middleware и добавлять его каким-то action в качестве фильтра. Для того чтобы сделать так нужно создать класс с произвольным названием и методом Configure

Теперь этот класс можно добавлять Action-ам с помощью следующего атрибута

Возможности журналирования и анализа логов в IIS 8.5

В новой версии Internet Information Services 8.5, представленной в качестве роли веб сервера в Microsoft Windows Server 2012 R2, появилась новая возможность логирования. IIS теперь может писать HTTP-логи в особый журнал трассировки через службу трассировки событий Windows (Event Tracing for Windows — ETW). Благодаря механизму Event Tracing for Windows в IIS 8.5 появилась возможность отслеживать события на веб сервере в реальном времени, что крайне полезно при отладке веб-приложений и поиске неисправностей.

В предыдущих версиях IIS логи веб-сервера записывались в отдельные лог-файлы. Основной недостаток данного механизма – кэширования логов в оперативной памяти. Логи из кэша записываются (сбрасываются) на диск каждую минуты или по достижению объема 64Кб. Это значительно усложняло онлайн-траблшутинг в IIS, т.к. высока вероятность того, что событие, появление которого вы ожидаете, произошло, но информация о нем пока просто не записалась в лог файл, и, соответственно, вы его не сразу не увидите.

В этой статье мы покажем, как в IIS 8.5 задействовать службу трассировки событий Windows (ETW) и как проанализировать полученные логи с помощью Microsoft Message Analyzer.

По умолчанию IIS 8.5 записывает логи в обычные тестовые файлы. Чтобы включить логирование через ETW, нужно в панели управления IIS (Internet Information Services Manager), выбрать имя сервера и в правой панели щелкнуть по значку Logging.

В окне настройки параметров журналирования в разделе Log Event Destination выберете метод ведения журнала, переключившись со стандартного Log file only на ETW event only. Обратите внимание, что можно включить ETW и стандартное журналирование IIS одновременно (Both log file and ETW event). Сохраним изменения. Сразу после этого логи веб сервера IIS начнут писаться через службу трассировки событий Windows.

Для просмотра и анализа логов IIS в журналах ETW воспользуемся бесплатным инструментом Microsoft Message Analyzer, который можно скачать с сайта Microsoft по этой ссылке: _http://www.microsoft.com/en-us/download/details.aspx? >

Во время первого запуска Microsoft Message Analyzer спросит, хотите ли вы обновить элементы на стартовом экране. Выберите желаемое действие.

В открывшемся окне Message Analyzer настроим доступ к логам IIS ETW. Для этого щелкните по ссылке Capture/Trace в левой колонке и укажите имя трассировки.

В разделе Trace Scenario Configuration в поле Add Provider введите IIS и из появившегося выпадающего списка выберите Microsoft-Windows-IIS-Logging.

После того, как мы подключились к нужному провайдеру ETW, можно начать просмотр ( и сбор) событий, нажав кнопку Start With.

Собранные данные будут отображены в виде таблицы (если эта опция была указана при запуске).

Чтобы уменьшить количество отображаемой информации, можно применять различные фильтры. Допустим, нам нужно вывести данные, касающиеся только определенного сайта IIS.

Для этого в расширенном описании нужного события щелкнем по полю S_sitename и выберем Add Ssitename To Filter (добавить имя сайта в фильтр).

В окне фильтров появится сгенерированный текст кода фильтра. Если нажать кнопку Apply Filter, в окне журнала останутся только данные, которые относятся к указанному нами сайту.

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

Итак, в этом небольшом обзоре мы разобрались с новыми возможностями анализа и поиска неисправностей на веб сервере IIS, с помощью журналирования событий веб-сервера через систему ETW. Также мы показали как можно анализировать полученных данных с помощью Microsoft Message Analyzer.

Что такое логи logs файл(ы) сайта и зачем они нужны?

log file, лог-файл, логи, logs.

Возможно, вам встречались эти слова?

Хочу рассказать, что это такое и зачем они нужны.

Иногда бывает, нужно посмотреть:

1) ошибки, которые возникали при обращении к сайту;

2) Кто и сколько раз приходил на сайт;

3) Параметры посещений (каким браузером и откуда был выполнен переход и.т.д.);

В общем, нужна статистика сайта.

Конечно, есть современные системы статистики, такие как Google Analytics и Яндекс.Метрика, которые позволяют получать эти данные в удобном виде.

Но, бывают ситуации, что на некоторых сайтах эти системы не установлены, а получить статистику все равно нужно.

Например, произошла какая-то критическая ситуация с сайтом и вам нужно выяснить что произошло, а никаких систем статистики на сайте не было.

Практически на любом сайте, по умолчанию, существуют специальные текстовые файлы, в которые записывается вся информация о посещения и ошибках, которые были на вашем сайте.

Эти файлы и называются логами (log file, log-файлами, лог-файлы, логи).

В общем, логи – это текстовые файлы, в которых хранится информация о посещениях, параметрах посещений вашего сайта и ошибках, которые возникали на нем.

Имя файла логов, для наглядности и чтобы можно было понять их назначение, состоит из двух частей:

Т.е. указывается назначение файла и добавляется приставка «_log».

Данные о посещениях

Данные об ошибках

Логи создаются серверным программным обеспечением. Этим они отличаются от систем Яндекс.Метрика и Google Аналитика, которые работают на основе Javascript-кода. Этот код встраивается на веб-страницы и передается браузером посетителя (клиентом) в базу данных систем статистики, которая хранится уже не на вашем сайте, а на сервере статистики.

Кстати, если хотите узнать конверсии и ключевые показатели (KPI) для вашего продающего сайта, могу настроить веб-аналитику.

Яндекс Метрика и Google Analytics. Цели, события, отчеты.

Анализ лог файлов сайта

Анализ лог файлов поможет в процессе оптимизации сайта на этапе поиска программных ошибок, которые мешают продвижению и могут даже стать причиной попадания сайта под фильтр. Лог файлы подразделяются на два типа: документы ошибок и посещений, соответственно error.log и access.log, о которых я сегодня и расскажу.

Для начала анализа надо подключить логи на хостинге, что можно в несколько кликов сделать в панели управления, после чего фиксация посещения сайта и ошибок на нём при визитах посетителей и ботов будет отображаться в лог файлах, расположенных в корне домена. Для их просмотра открываем ftp-соединение с сервером через Total Commander и видим возле папки public_html (на Joomla)файлы логов, открыть которые в свою очередь можно нажав F4 и выбрав текстовой редактор.

Error.log

Этот файл показывает ошибки, возникшие при визите на сайт, и часто помогает найти косяки, которые не видны взгляду простого смертного снаружи сайта. Так в строке ошибок мы видим –

  1. Время возникновения ошибки,
  2. IP-адрес посещения,
  3. Описание ошибки,
  4. Адрес проблемного web-документа.

В основном анализ error.log интересен тем, что позволяет увидеть, какие документы сайта недоступны, что поможет быстро устранить недоработки по программной линии без банального тыканья пальцем в небо. Лично мне анализ лог файлов помог вывести блог из-под АГС (нервных просят не смотреть – не этот), так как там было полно программных ошибок.

Access.log

В этом документе можно посмотреть, что творится на сайте при посещениях ботами и пользователями, то есть какие HTTP-статусы отдаёт сайт при визитах, с какого адреса пришли на какую страницу, с какого адреса IP и какие боты. С помощью access.log можно отследить активность роботов и увидеть, как они читают web-документы, то есть access я бы назвал более широкоформатным дополнением к error.log.

Для тех, кто не в танке предлагаю перед анализом логов ознакомиться с HTTP-статусами, иначе пользы от напряжения ума и глаз не будет, а упростить задачу по анализу поможет бесплатная программа Awstats, которую можно поставить в панели управления практически любого хостинга.

Конечно, сидеть сутками и изучать внутренность файлов посещений и ошибок не стоит, но как часть анализа сайта сие деяние необходимо, ибо оно часто помогает понять за 5 минут то, что было тайной за семью печатями очень долго и создавало проблемы и продвижению сайта и, как следствие, заработку на нём.

Если Вы хотите полностью проверить сайт и узнать его основные характеристики + посмотреть теги ресурса, объём текста, количество обратных ссылок, историю изменения параметров и прочее, то проверить сайт можно на сервисе prlog.ru и это будет отличным дополнением к анализу логов.

Дмитрий здравствуйте! Целый день убила на то, чтобы найти хоть какую-то информацию о Error.log Везде настолько мизерно написано, что ничего не понятно. У вас более менее доходчиво. А вы не могли бы мне помочь расшифровать ошибки? У меня проблемы с сайтом начались и я не знаю, что и где исправляется.

Весь конечно файл я не смогу привести, но хотя бы немного.

Илон Маск рекомендует:  Удаление html элементов из текста
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Член Описание
Provider
AddUserToRole()
AddUserToRoles()
AddUsersToRole()
AddUsersToRoles()
CreateRole()
DeleteRole()
FindUsersInRole()
GetAllRoles()
GetRolesForUser()
GetUsersInRole()
IsUserInRole()
RemoveUserFromRole()
RemoveUserFromRoles()
RemoveUsersFromRole()
RemoveUsersFromRoles()
RoleExists()