Apache access log почему не обрезается
Перейти к содержимому

Apache access log почему не обрезается

Логи в Apache

Каждому из нас хочется побыть «большим братом» и последить за своими посетителями. Это можно делать по-разному: поставить счетчик, например, HotLog, поставить особый скрипт, ну а некоторые делают это с помощью логов Apache. Да-да, вы не ослышались, Apache тоже ведет логи.

На практике необходимо понять значение всего двух директив: LogFormat и CustomLog. Есть еще директива ErrorLog, но лично я использую лог ошибок только для просмотра последних строчек, когда Apache не пускается. Все-таки скажу несколько слов о ErrorLog.

Сами разработчики считают лог ошибок сервера, создающийся директивой ErrorLog, и хранящий все сообщения об ошибках и всю диагностику, наиболее важным логом. Не верьте им. Еррор-лог создается так:

Практически никак не настраивается, однако есть важная директива LogLevel. Она дает указания серверу писать или не писать в лог ошибки различной степени тяжести. Например, директива

Заставит сервер жаловаться только на самые критические проблемы, когда сервер не запускается. Далее параметры по убывающей: alert, crit, error, warn, notice, info и, конечно же, мой любимый

При котором вам будет рассказано даже о том, что сервер все-таки открывает в данный момент файл конфигурации

Таким образом, если вам нужны логи ошибок, то в httpd.conf следует указать директиву ErrorLog с параметром «имя лога» (путь считается относительно ServerRoot) и LogLevel с параметром «степень точности». Далее все на вашей совести

Теперь о том, что считаю важным я: Combined Logs. Эти логи повествуют о том, кто, когда и зачем отправлял запросы к серверу. Правда, интересно? Здесь еще две директивы: LogFormat и CustomLog. Покопайтесь в каком-нибудь httpd.conf и вы обязательно увидите там что-нибудь типа

Хех, все понятно? Сейчас объясню что это значит. LogFormat принимает два параметра: описание формата лога и название этого формата. Как видите, лог, состоящий из «%h %l %u %t «%r» %>s %b» называется common. А что значат закорючки, читайте тут:
%h — IP клиента. Кстати, это запросто может быть и ип его прокси.
%l — это что-то непонятное, касающееся идентификации клиента по RFC 1413. Кстати, апач не пытается ее определить, если только директива IdentityCheck не установлена в On
%u — то, что было введено в качестве имени пользователя а HTTP-авторизации. То же самое, что и $HTTP_AUTH_USER
%t — время поступления запроса. В комментариях не нуждается.
%r — строка запроса клиента, например «GET /xxx.gif HTTP/1.1». Обычно заключается в кавычки, но поскольку кавычки — спецсимволы, они предваряются бэкслэшами — . Таким образом, то, что будет выглядеть в логе как строчка в кавычках, оформляется так: «%r»
%>s — код ответа сервера клиенту.
%b — размер ответа клиенту. В байтах.
% — адрес страницы, откуда пришел посетитель.
% — тип браузера посетителя. Этот и предыдущий параметр тоже обычно указывают в кавычках, как и %r

Эти параметры можно комбинировать в любом порядке и в любом количестве. Захотите определять только IP посетителей — пишете так:

Вот и определен новый формат лога. В общем, комбинируйте как хотите. Но логи эта директива не создает. Чтобы сервер начал писать лог, надо потребовать этого директивой CustomLog, которая принимает два параметра: имя файла лога и его тип. Таким образом, чтобы записывать IP клиентов, надо добавить еще и такую строчку:

И только после этого лог начнет нормально вестись. Кстати, популярным считается стандарт «combined log», описывающийся так:

Как видите, довольно информативно. А теперь на минуту представьте себе, что ваш сервер обрабатывает около миллиона запросов в день. И вам охота вести несколько логов. Ну это обычное явление: сколько скажете раз CustomLog, столько логов и создастся, а ну как вам захочется всех поисковиков, ищущих robots.txt писать в отдельный лог? Ладно. Рассказываю.

Есть еще такая полезная директива SetEnvIf (или SetEnvIfNoCase — то же самое, но без учета больших/маленьких букв), она позволяет в зависимости от условия определять переменные среды. Например:

После этого переменная env будет равняться «crawler». Но это еще не все! В зависимости от значения этой переменной вы можете делать запись в разные логи! Вот так:

Вот так, нашему апачу палец в рот не клади Не буду рассказывать почему robots.txt так странно написано, называется это регулярные выражения, а почитать про них можно либо в учебнике, либо в странице мануала перла по имени perlre. Вот так: man perlre. Под юниксом, конечно

Уфф. Все, вроде? Нет, есть еще пипы. Пипы (pipes) позволяют предварительно (прежде чем чего-то в логи записать), что-нибудь эдакое с ними сотворить, например сжать. Стандартный значок пипы в юниксе — вертикальная палка, так что если вам приспичит логи сразу сжимать, делайте так:

Все под юниксом Просто потому, что если у вас апач на винде, то логи вести незачем — врядли она у вас сервером работает %)

Подробнее о логах в Apache

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

Традиционно Apache создает два основных типа лог-файлов, это error_log и access_log. Как можно понять по названию самих файлов в файл error_log будут журналироваться сообщения об ошибках, а в файл access_log – запросы на веб-сервер. Настраиваются лог файлы в конфигурационном файле веб-сервера Apache, путь к файлу error_log задаются директивой:

Стоит отметить, что сообщения об ошибках в свою очередь делятся на уровни, и задаются директивой LogLevel.

Существуют следующие уровни ошибок:
emerg — фатальные ошибки;
alert — необходимо немедленно исправить ситуацию;
crit — критические ошибки;
error — обычные ошибки;
warn — предупреждения;
notice — уведомления;
info — информация;
debug — подробные уведомления для отладки.

В зависимости от операционной системы пути по умолчанию к файлу ErrorLog могут отличаться, некоторые из них:
RHEL / Red Hat / CentOS / Fedora Linux

Debian / Ubuntu Linux Apache

FreeBSD

Второй тип файла лога – лог доступа access_log, устанавливается директивой CustomLog:

Здесь так же можно настроить формат вывода сообщений в лог, за это отвечает директива LogFormat.
Рассмотрим значения, которые могут выводиться в лог файл access_log:

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

RHEL / Red Hat / CentOS / Fedora Linux

Debian / Ubuntu Linux

FreeBSD

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

How To Configure Logging And Log Rotation In Apache On An Ubuntu VPS

How To Configure Logging And Log Rotation In Apache On An Ubuntu VPS

This article covers a version of Ubuntu that is no longer supported. If you are currently operate a server running Ubuntu 12.04, we highly recommend upgrading or migrating to a supported version of Ubuntu:

Reason: Ubuntu 12.04 reached end of life (EOL) on April 28, 2017 and no longer receives security patches or updates. This guide is no longer maintained.

See Instead:
This guide might still be useful as a reference, but may not work on other Ubuntu releases. If available, we strongly recommend using a guide written for the version of Ubuntu you are using. You can use the search functionality at the top of the page to find a more recent version.

Introduction

The Apache web server can be configured to give the server administrator important information about how it is functioning and what issues, if any, need to be addressed.

The main avenue for providing feedback to the administrator is through the use of log files. Apache has a very configurable logging mechanism that can be used to output messages to different places based on instructions.

In this guide, we will look at how to utilize Apache’s logging functionality to set up structured, easy-to-parse logs. We will be using a default Apache2 installation on an Ubuntu 12.04 VPS. Other distributions should operate in a similar fashion.

Apache Log Levels

Apache separates all informational messages into categories depending on how important it considers the information.

For instance, for the most important messages, considered emergencies, Apache designates the log level as «emerg». The «info» tag, on the other hand, just shows helpful information that can be useful to look at occasionally.

Here are the log levels that Apache recognizes, from most important to least:

  • emerg: Emergency situations where the system is in an unusable state.
  • alert: Severe situation where action is needed promptly.
  • crit: Important problems that need to be addressed.
  • error: An Error has occurred. Something was unsuccessful.
  • warn: Something out of the ordinary happened, but not a cause for concern.
  • notice: Something normal, but worth noting has happened.
  • info: An informational message that might be nice to know.
  • debug: Debugging information that can be useful to pinpoint where a problem is occurring.
  • trace[1-8]: Tracing information of various levels of verbosity that produces a large amount of information.

When you specify a log level, you are not choosing to log the messages labeled in that category, you are choosing the least important level that you wish to log.

This means that any levels above the selected level are also logged. For example, if you choose the «warn» log level, messages tagged with warn, error, crit, alert, and emerg will all be logged.

We specify the level of logging desired with the «LogLevel» directive. We can see the default log level in the default configuration file:

As you can see, by default, we have Apache configured to log messages with a priority of «warn» and above. We will learn where Apache logs its messages in the following section.

Where does Apache Keep Its Logs?

Apache can be told where to place its logs using server-wide logging specifications. You can also configure logging individually for each separate virtual host.

Server-Wide Logging

To find out where the server logs information by default, we can open the default configuration file. On Ubuntu, this is «/etc/apache2/apache2.conf»:

If we search the file, we can find a line that looks like this:

This directive names the file where Apache will keep its error messages. As you can see, it utilizes an environmental variable called «APACHE_LOG_DIR» to get the prefix of the directory path.

We can find out what the «APACHE_LOG_DIR» is set to by examining a different file, the aptly-named «envvars» file:

We can see in this line, that the «APACHE_LOG_DIR» variable is set to the directory «/var/log/apache2». This means that when combined with the directive in the «apache2.conf» file, Apache will log into a file called «/var/log/apache2/error.log»:

We can see the error.log file and some other log files as well.

Virtual Host Logging

The «access.log» file at the end of the previous section is not configured in the «apache2.conf» file. Instead, the package maintainer decided to place the directive specifying its use within a virtual host definition.

Examine the default virtual host definition to see the access log declaration:

If we scroll through the file, we will see three separate values concerning logging:

The ErrorLog definition matches the one in the default configuration file. It is not necessary to have that line in both places, but it does not hurt to be specific incase you change the location in one place or another.

Defining Custom Logs

In the previous section, the line describing the «access.log» file uses a different directive than the preceding log lines. It uses «CustomLog» to specify the access.log location:

This directive takes the following syntax:

The log format in this example is «combined». This is not an internal Apache specification. Instead, this is a label for a custom format that is defined in the default configuration file.

If we open the default config file again, we can see the line that defines the «combined» log format:

The «LogFormat» command defines a custom format for logs that can be called using the «CustomLog» directive as we saw in the virtual host definition.

This log format specifies a format known as a «combined» format. Learn more about available format string variables by going here.

As you can see, there are several other common formats that have been created for use within your virtual host definitions. You can uses them exactly like you see the CustomLog declaration earlier. You can also create your own custom log formats.

Rotating Apache Log Files

Because Apache is capable of logging a large quantity of information during the process of handling requests from clients, it is necessary to set up a system for rotating the logs.

Log rotation can be as simple as switching out logs as they get too big, or it can be a system of archiving and storing old copies to reference at a later date. This depends on your configuration.

Below, we will discuss some different methods of achieving this.

Manually Rotating Logs

It is not possible to move log files while Apache is running, so instead, the server must be restarted in order to swap the old logs for fresh logs.

This can be accomplished manually by moving the files, then soft-restarting Apache so that it can begin to use the new logs for new connections.

The example used in the Apache documentation is here. You may need to precede these commands with «sudo» to gain appropriate privileges:

This will move the files, reload the server, and wait 600 seconds. This will allow Apache to continue using the old log files to complete logging from old requests. During this time, new requests will be logged to the new, refreshed files.

While it is good to know how to do this manually, this would be unsustainable for larger server environments.

Managing Log Rotation Using Logrotate

By default, Ubuntu sets up its own log rotation plan with logrotate.

This program can take parameters and rotate logs when certain criteria are met. We can see what events cause logrotate to swap the Apache logs by looking in «/etc/logrotate.d/apache2»:

Here, you can see some of the parameters given to logrotate. First of all, notice the first line is:

This means that logrotate will only operate on those logs in «/var/log/apache2». Keep this in mind if you have chosen a different directory for your logs in your Apache configuration.

We can see that the logs are rotated weekly and that they save a years-worth of logs by default. We can also see that there is a section that reloads Apache after the rotation:

These lines make sure that apache is reloaded automatically whenever a rotation is complete. The parameters within this file can be changed at will, but the configuration is outside of the scope of this article.

Logging Using Pipes

Using a pipe instead of a file is an easy way to allow a separate logging program to handle the output. This solves the log rotation problem too, since that can be handled by the backend logging program instead of by Apache itself.

If we wanted the access log to be handled by a logging program that accepts standard input, we could change the line to this:

Apache starts the logging program when it begins and restarts it if the logging process fails for any reason.

Although multiple programs can be configured to rotate logs, Apache includes one called «rotatelogs» by default. You can configure it as follows:

Similar configuration can be achieved with other logging utilities.

Conclusion

It is important that you are logging everything that you need to correctly administrate your servers, and that you have a good log rotation mechanism in place in order to prevent files from growing too large.

You should now understand how to create and configure logging for Apache. The information that you have logged can be used to troubleshoot problems and anticipate when actions need to be taken.

Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

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

Ваш адрес email не будет опубликован.