syslog-ng e nginx logs para o mysql

2

Então alguns dias atrás eu perguntei como fazer o registro de logs php e nginx no banco de dados MySQL centralizado , e m0ntassar deu uma resposta perfeita :) alegria!

O problema que estou enfrentando agora é que não consigo fazer funcionar.

versão syslog-ng:

# syslog-ng --version
syslog-ng 3.2.5

Este é o meu formato de registro nginx:

log_format      main    '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

fonte syslog-ng:

source nginx { file( "/var/log/nginx/tg-test-3.access.log"
                     follow_freq(1)
                     flags(no-parse)
     );
};

destino 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"));
};

Tabela MySQL para fins de teste:

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

Agora, a primeira coisa que dá errado é quando eu reinicio o 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  ]

Eu tentei criar um destino de arquivo e tudo funciona bem. Depois, tentei substituir meu destino por:

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"));
};

Que funcionou e estava escrevendo coisas para o mysql,

O problema é que eu quero escrever coisas no formato exato como o formato de log nginx é.

Suponho que estou sentindo falta de algo realmente simples ou preciso fazer alguma análise entre a origem e o destino.

Qualquer ajuda será muito apreciada:)

    
por Katafalkas 13.11.2012 / 10:23

1 resposta

2

Eu posso ajudar você a escrever o log de acesso do nginx ao postgres. Vamos lá formato de registro 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; Vamos.

Configurar o 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); };

Instalar pacotes para enviar para o banco de dados

apt-get install libdbd-pgsql -y

Configurar o db-postgres Crie nginx_logs de banco de dados. Conceda acceess no pg_hba.conf

    
por 27.09.2017 / 12:05