だから数日前に私は phpとnginxのログを一元化されたMySQLデータベースに記録する方法 と尋ねました、そしてm0ntassarは完璧な答えを与えました:)乾杯!
私が今直面している問題は、それを機能させることができないように見えることです。
syslog-ngバージョン:
# syslog-ng --version
syslog-ng 3.2.5
これは私のnginxログ形式です:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
syslog-ngソース:
source nginx { file( "/var/log/nginx/tg-test-3.access.log"
follow_freq(1)
flags(no-parse)
);
};
syslog-ngの宛先:
destination d_sql {
sql(type(mysql)
Host("127.0.0.1") username("syslog") password("superpasswd")
database("syslog")
table("nginx")
columns("remote_addr","remote_user","time_local","request","status","body_bytes_sent","http_ referer","http_user_agent","http_x_forwarded_for")
values("$REMOTE_ADDR", "$REMOTE_USER", "$TIME_LOCAL", "$REQUEST", "$STATUS","$BODY_BYTES_SENT", "$HTTP_REFERER", "$HTTP_USER_AGENT", "$HTTP_X_FORWARDED_FOR"));
};
テスト用のMySQLテーブル:
CREATE TABLE `nginx` (
`remote_addr` varchar(100) DEFAULT NULL,
`remote_user` varchar(100) DEFAULT NULL,
`time` varchar(100) DEFAULT NULL,
`request` varchar(100) DEFAULT NULL,
`status` varchar(100) DEFAULT NULL,
`body_bytes_sent` varchar(100) DEFAULT NULL,
`http_referer` varchar(100) DEFAULT NULL,
`http_user_agent` varchar(100) DEFAULT NULL,
`http_x_forwarded_for` varchar(100) DEFAULT NULL,
`time_local` text,
`datetime` text,
`Host` text,
`program` text,
`pid` text,
`message` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1
ここで最初に問題になるのは、syslog-ngを再起動したときです。
# /etc/init.d/syslog-ng restart
Stopping syslog-ng: [ OK ]
Starting syslog-ng: WARNING: You are using the default values for columns(), indexes() or values(), please specify these explicitly as the default will be dropped in the future;
[ OK ]
ファイルの宛先を作成しようとしましたが、すべて正常に機能し、宛先を次のように置き換えてみました。
destination d_sql {
sql(type(mysql)
Host("127.0.0.1") username("syslog") password("kosmodromas")
database("syslog")
table("nginx")
columns("datetime", "Host", "program", "pid", "message")
values("$R_DATE", "$Host", "$PROGRAM", "$PID", "$MSGONLY")
indexes("datetime", "Host", "program", "pid", "message"));
};
これは機能し、mysqlに何かを書き込んでいました。
問題は、nginxログ形式と同じように正確な形式でデータを書き込みたいということです。
本当に単純なものが欠けているか、ソースと宛先の間で解析を行う必要があると思います。
どんな助けでも大歓迎です:)
私はあなたがpostgresにnginxアクセスログを書くのを手伝うことができます。手放すNginxログ形式
log_format logtodb '$time_iso8601;$http_Host;$remote_addr;$http_x_forwarded_for;$request_method;$request;$status;$body_bytes_sent;$http_referer;$request_time;$upstream_http_x_cache;$uri;$upstream_addr;$Host;$upstream_response_length;$upstream_status;$server_name;$newurl;$upstream_respons
e_time ';
access_log /var/log/nginx/access_logtodb.log logto
db;行こう。
syslog-ngを設定
nano /etc/syslog-ng/syslog.ng
#########################################################################
###### tailing nginx accesslog and sending to syslog-ng##################
source nginx_acceess_log { file( "/var/log/nginx/access_logtodb.log"
follow_freq(1)
flags(no-parse)
);
};
parser p_nginx_acceess_log {
csv-parser(columns("NGINX_TIME", "NGINX_http_Host", "NGINX_remote_addr", "NGINX_http_x_forwarded_for", "NGINX_request", "NGINX_request_method","NGINX_status", "NGINX_body_bytes_sent", "NGINX_http_referer", "NGINX_request_time", "NGINX_upstream_http_x_cache", "NGINX_uri", "NGINX_upstream_addr", "NGINX_Host", "NGINX_upstream_response_length", "NGINX_upstream_status", "NGINX_server_name", "NGINX_newurl", "NGINX_upstream_response_time")
flags(escape-double-char,strip-whitespace)
delimiters(";")
quote-pairs('""[]')
);
};
destination d_postgres_nginx_acceess_log{
sql(type(pgsql)
Host("10.12.1.1") port("5432") username("postgres") password("A1s2gdfgdfgdgdfgd")
database("nginx_logs")
table("access_log_nginx_223")
columns("NGINX_TIME text", "NGINX_http_Host text", "NGINX_remote_addr text", "NGINX_http_x_forwarded_for text", "NGINX_request_method text", "NGINX_request text", "NGINX_status varchar(3)", "NGINX_body_bytes_sent text", "NGINX_http_referer text", "NGINX_request_time text", "NGINX_upstream_http_x_cache text", "NGINX_uri text", "NGINX_upstream_addr text", "NGINX_Host text", "NGINX_upstream_response_length text", "NGINX_upstream_status varchar(3)", "NGINX_server_name text", "NGINX_newurl text", "NGINX_upstream_response_time text")
values("${NGINX_TIME}", "${NGINX_http_Host}", "${NGINX_remote_addr}", "${NGINX_http_x_forwarded_for}", "${NGINX_request_method}", "${NGINX_request}", "${NGINX_status}", "${NGINX_body_bytes_sent}", "${NGINX_http_referer}", "${NGINX_request_time}", "${NGINX_upstream_http_x_cache}", "${NGINX_uri}", "${NGINX_upstream_addr}", "${NGINX_Host }", "${NGINX_upstream_response_length}", "${NGINX_upstream_status}", "${NGINX_server_name}", "${NGINX_newurl}", "${NGINX_upstream_response_time}")
indexes("NGINX_request", "NGINX_uri", "NGINX_server_name"));
};
log {source(nginx_acceess_log); parser(p_nginx_acceess_log); destination(d_postgres_nginx_acceess_log); };
dbに送信するためのパケットをインストールします
apt-get install libdbd-pgsql -y
db-postgresの構成データベースnginx_logsを作成します。 pg_hba.confでアクセスを許可します