LINUX.ORG.RU

Разделить логи Nginx

 , , ,


0

2

Ребят, вечер добрый.

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

	location ~ .* {
		
		if ($http_user_agent ~* (Yandex)) {
		access_log /var/log/nginx/bots/Yandex.log;
		return 200;
		}
		if ($http_user_agent ~* (Googlebot)) {
		access_log /var/log/nginx/bots/Googlebot.log;
		return 200;
		}
		if ($http_user_agent ~* (Mail.Ru)) {
		access_log /var/log/nginx/bots/Mail.Ru.log;
		return 200;
		}
		if ($http_user_agent ~* (StackRambler)) {
		access_log /var/log/nginx/bots/StackRambler.log;
		return 200;
		}
		if ($http_user_agent ~* (Bing)) {
		access_log /var/log/nginx/bots/Bing.log;
		return 200;
		}
	}

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

Так же прошу подсказать, как логировать особо активные IP? Вывести в отдельный файл с именем IP и туда весь лог access по нему?

Спасибо за ответы.

Если убрать return 200;, то грузит?

Так же прошу подсказать, как логировать особо активные IP? Вывести в отдельный файл с именем IP и туда весь лог access по нему?

Вродь только если парсить общий access_log. Там уже сможешь считать количество обращений с определенного IP и запихивать в отдельный лог. А еще лучше заюзать awstats.

iron ★★★★★ ()
Ответ на: комментарий от MrClon

Суть то ясна, но без ретёрна, вообще 404 выдает. Решение выше - нагуглено в яндексе, пытаюсь свое решение правильное создать. Ушел читать про map, спасибо.

foxer666 ()
Ответ на: комментарий от foxer666

Логично, фигли. Ifы засунуты в какой-то левый локейшен (видимо перехватывающий все запросы), следовательно не попадают в нужный локейшен (скорее всего перенаправляющий запросы бекэнду).
Такие косяки бывают когда конфиг составляется методом копипасты из интернетов, без понимания сути того что копипастишь.
У nginx есть жирнейшая документация, и даже на русском, почитай её: http://nginx.org/ru/docs/

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Примерно так и есть, локейшены пробовал два - / и php. На обоих та же картина. Документации читаю частенько, но не всегда она с реалиями сходится, как например IF http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html#if Про локейшн нет ни слова в примерах, указано, что можно юзать, а примеров нет. То же самое с логами, указано, что работают такие условия только в локейшенах, а примера в документации нет.

foxer666 ()
Ответ на: комментарий от foxer666

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

То же самое с логами, указано, что работают такие условия только в локейшенах

Ты о чём?

MrClon ★★★★★ ()
Ответ на: комментарий от alozovskoy

Зачем, если можно лить только нужное, а ненужно лить в другое место или не лить вовсе?

foxer666 ()

Говорят, Googlebot не любит, когда ему отдельный сайт показывают, и рейтинг твоего сайта наоборот понижается. Если же ты правда делаешь, то что ты описал, то сделай хотя-бы один лог для всех поисковых ботов. Но в любом случае, смысла в отделении поисковых ботов не много. Обычно логи разделяют по location, ну и это намного проще и понятней. И если будешь делать, лучше наверно использовать map, как уже выше написали, вот тебе пример.

anonymous_sama ★★★★★ ()
Ответ на: комментарий от foxer666

Условие IF для лога работает только в локейшн

В каком смысле? Переменная http_user_agent не доступна в server что-ли?

MrClon ★★★★★ ()

если у тебя нет хотя бы десятка гигабайт лога за сутки, то странная затея.

v9lij ★★★★★ ()
Ответ на: комментарий от MrClon

IF с логами поддерживается только в location. http://nginx.org/ru/docs/http/ngx_http_log_module.html

Синтаксис:	access_log путь [формат [buffer=размер] [gzip[=степень]] [flush=время] [if=условие]];
Контекст:	http, server, location, if в location, limit_except

А вот map поддерживается в http. Надо на него переходить. Note that maps must be created outside of the server block.

foxer666 ()
Ответ на: комментарий от MrClon

Почитал про map. Нельзя использовать в server. Только http. Операция по поддоменами на лету и делению логов не прокатила :( Зато с IF все работает.

foxer666 ()
Ответ на: комментарий от foxer666

Почитал про map. Нельзя использовать в server. Только http.

Не аккуратно конечно, но разве это проблема? Значение переменной заданной через map вычисляется только при обращении к ней.

MrClon ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.