{"id":2958,"date":"2021-09-27T07:00:00","date_gmt":"2021-09-27T05:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=2958"},"modified":"2021-09-07T20:43:54","modified_gmt":"2021-09-07T18:43:54","slug":"zwei-bash-skripte-zur-analyse-der-nginx-access-logs","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/zwei-bash-skripte-zur-analyse-der-nginx-access-logs\/","title":{"rendered":"Zwei Bash-Skripte zur Analyse der NGINX Access Logs"},"content":{"rendered":"\n<p>Beim Durchw\u00fchlen des Internets bin ich auf eine Perle gesto\u00dfen, die ich hier festhalten m\u00f6chte. In &#8222;<a href=\"https:\/\/sysadmins.co.za\/bash-script-to-parse-and-analyze-nginx-access-logs\/\">Bash Script to Parse and Analyze Nginx Access Logs<\/a>&#8220; stellt <a href=\"https:\/\/gist.github.com\/ruanbekker\">Ruan Bekker<\/a> ein kurzes Bash-Skript vor, welches die NGINX Access Logs analysiert, um einen Bericht mit folgenden Sektionen auszugeben:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Top 10 Request IPs (aus dem aktuellen Access Log)<\/li><li>Top Request Methods (aus dem aktuellen Access Log)<\/li><li>Top 10 Request Pages (aus dem aktuellen Access Log)<\/li><li>Top 10 Request Pages (aus dem aktuellen und Gzipten Logs)<\/li><li>Top 10 HTTP 404 Page Responses (aus dem aktuellen und Gzipten Logs)<\/li><\/ul>\n\n\n\n<p>Ich selbst nutze aktuell den <a href=\"https:\/\/gist.github.com\/marcbrunet\/703310bea5e1ffdba57cac3608c4d106\">Fork<\/a> von <a href=\"https:\/\/gist.github.com\/marcbrunet\">Marc Brunet<\/a>, welchen ich meinen <a href=\"https:\/\/github.com\/Tronde\/My-IT-Scripts\">My-IT-Scripts<\/a> hinzugef\u00fcgt habe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\n# URL: https:\/\/github.com\/Tronde\/My-IT-Scripts\/blob\/master\/bash\/analyze_nginx_access_logs.sh\n\n# variables\nLOGFILE=\"\/var\/www\/jkastning\/sites\/logs\/www.my-it-brain.de_access.log\"\nLOGFILE_GZ=\"\/var\/www\/jkastning\/sites\/logs\/www.my-it-brain.de_access.log.*\"\nRESPONSE_CODE=\"200\"\n\n# functions\nfilters(){\ngrep -w $RESPONSE_CODE \\\n| grep -v \"\\\/rss\\\/\" \\\n| grep -v robots.txt \\\n| grep -v \"\\.css\" \\\n| grep -v \"\\.jss*\" \\\n| grep -v \"\\.png\" \\\n| grep -v \"\\.ico\"\n}\n\nfilters_404(){\ngrep -w \"404\"\n}\n\nrequest_ips(){\nawk '{print $1}'\n}\n\nrequest_method(){\nawk '{print $6}' \\\n| cut -d'\"' -f2\n}\n\nrequest_pages(){\nawk '{print $7}'\n}\n\nwordcount(){\nsort \\\n| uniq -c\n}\n\nsort_desc(){\nsort -rn\n}\n\nreturn_kv(){\nawk '{print $1, $2}'\n}\n\nrequest_pages(){\nawk '{print $7}'\n}\n\nreturn_top_ten(){\nhead -10\n}\n\n## actions\nget_request_ips(){\necho \"\"\necho \"Top 10 Request IP's:\"\necho \"====================\"\n\ncat $LOGFILE \\\n| filters \\\n| request_ips \\\n| wordcount \\\n| sort_desc \\\n| return_kv \\\n| return_top_ten\necho \"\"\n}\n\nget_request_methods(){\necho \"Top Request Methods:\"\necho \"====================\"\ncat $LOGFILE \\\n| filters \\\n| request_method \\\n| wordcount \\\n| return_kv\necho \"\"\n}\n\nget_request_pages_404(){\necho \"Top 10: 404 Page Responses:\"\necho \"===========================\"\nzgrep '-' $LOGFILE $LOGFILE_GZ\\\n| filters_404 \\\n| request_pages \\\n| wordcount \\\n| sort_desc \\\n| return_kv \\\n| return_top_ten\necho \"\"\n}\n\n\nget_request_pages(){\necho \"Top 10 Request Pages:\"\necho \"=====================\"\ncat $LOGFILE \\\n| filters \\\n| request_pages \\\n| wordcount \\\n| sort_desc \\\n| return_kv \\\n| return_top_ten\necho \"\"\n}\n\nget_request_pages_all(){\necho \"Top 10 Request Pages from All Logs:\"\necho \"===================================\"\nzgrep '-' --no-filename $LOGFILE $LOGFILE_GZ \\\n| filters \\\n| request_pages \\\n| wordcount \\\n| sort_desc \\\n| return_kv \\\n| return_top_ten\necho \"\"\n}\n\n# executing\nget_request_ips\nget_request_methods\nget_request_pages\nget_request_pages_all\nget_request_pages_404<\/code><\/pre>\n\n\n\n<p>Selbstverst\u00e4ndlich erhalte ich damit keine genauen Statistiken, da meine Logs nach einem Monat automatisch gel\u00f6scht werden. F\u00fcr einen kurzen R\u00fcckblick und der Erstellung eines monatlichen Berichts scheint das kleine Skript jedoch gut geeignet zu sein. Ich probiere es gerade aus, um zu sehen, wie gut es mir auf Dauer gef\u00e4llt.<\/p>\n\n\n\n<p>Auf Basis des ersten Skripts habe ich ein zweites geschrieben, mit dessen Hilfe ich die Requests f\u00fcr einen spezifischen Beitrag abfragen kann (<a href=\"https:\/\/github.com\/Tronde\/My-IT-Scripts\/blob\/master\/bash\/get_page_requests_from_nginx_access_logs.sh\">Quelle<\/a>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\n# variables\nLOGFILE=\"\/var\/www\/jkastning\/sites\/logs\/www.my-it-brain.de_access.log\"\nLOGFILE_GZ=\"\/var\/www\/jkastning\/sites\/logs\/www.my-it-brain.de_access.log.*\"\nRESPONSE_CODE=\"200\"\nARG1=$1\n\n# functions\nfilters(){\ngrep -w $RESPONSE_CODE \\\n| grep -v \"\\\/rss\\\/\" \\\n| grep -v robots.txt \\\n| grep -v \"\\.css\" \\\n| grep -v \"\\.jss*\" \\\n| grep -v \"\\.png\" \\\n| grep -v \"\\.ico\"\n}\n\nrequest_ips(){\nawk '{print $1}'\n}\n\nrequest_page(){\nawk '{print $7}' \\\n| grep -w $ARG1\n}\n\nwordcount(){\nsort \\\n| uniq -c\n}\n\nreturn_kv(){\nawk '{print $1, $2}'\n}\n\nget_request_page(){\necho \"Page requests in current log:\"\necho \"=====================\"\ncat $LOGFILE \\\n| filters \\\n| request_page \\\n| wordcount \\\n| return_kv\necho \"\"\n}\n\nget_request_page_all(){\necho \"Page requests in all logs (last month):\"\necho \"===================================\"\nzgrep '-' --no-filename $LOGFILE $LOGFILE_GZ \\\n| filters \\\n| request_page \\\n| wordcount \\\n| return_kv\necho \"\"\n}\n\n# execute\nget_request_page\nget_request_page_all<\/code><\/pre>\n\n\n\n<p>Der folgende Code-Block zeigt ein Beispiel, wie das Skript angewendet wird. Dabei wird der Permalink als Argument \u00fcbergeben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>:~\/bin$ sh get_page_requests_from_nginx_access_logs.sh kommentar-linux-container-spreu-und-weizen\nPage requests in current log:\n=====================\n262 \/wordpress\/kommentar-linux-container-spreu-und-weizen\/\n6 \/wordpress\/kommentar-linux-container-spreu-und-weizen\/feed\/\n\nPage requests in all logs (last month):\n===================================\n5124 \/wordpress\/kommentar-linux-container-spreu-und-weizen\/\n49 \/wordpress\/kommentar-linux-container-spreu-und-weizen\/feed\/\n2 \/wordpress\/wp-json\/oembed\/1.0\/embed?url=https:\/\/www.my-it-brain.de\/wordpress\/kommentar-linux-container-spreu-und-weizen\/<\/code><\/pre>\n\n\n\n<p>Noch nicht sch\u00f6n, aber zweckm\u00e4\u00dfig.<\/p>\n\n\n\n<p>Was haltet ihr davon? Falls ihr beim Dr\u00fcbergucken zuf\u00e4llig noch einen Fehler in den Skripten entdeckt, freue ich mich, wenn ihr mir einen Kommentar hinterlasst.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beim Durchw\u00fchlen des Internets bin ich auf eine Perle gesto\u00dfen, die ich hier festhalten m\u00f6chte. In &#8222;Bash Script to Parse and Analyze Nginx Access Logs&#8220; stellt Ruan Bekker ein kurzes Bash-Skript vor, welches die NGINX Access Logs analysiert, um einen Bericht mit folgenden Sektionen auszugeben: Top 10 Request IPs (aus dem aktuellen Access Log) Top<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/zwei-bash-skripte-zur-analyse-der-nginx-access-logs\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[51],"tags":[323,175,304,430,305],"class_list":["post-2958","post","type-post","status-publish","format-standard","hentry","category-linux","tag-access_log","tag-bash","tag-nginx","tag-osbn","tag-planet"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=2958"}],"version-history":[{"count":2,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2958\/revisions"}],"predecessor-version":[{"id":2961,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2958\/revisions\/2961"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=2958"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=2958"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=2958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}