hacer un archivo de registro


22

¿Hay alguna manera de hacer un archivo de registro para mantener algunos datos en / var / log / con la ayuda de alguna función de biblioteca o llamada al sistema en lenguaje c en linux? Y también quiero saber los estándares que debemos seguir para escribir y procesar el registro. Gracias


Tenga en cuenta que las preguntas de programación generalmente están fuera de tema aquí; debes preguntarles en Stack Overflow . Aquí está bien una explicación de la API, pero las explicaciones sobre cómo usarla en C u otro lenguaje de programación normalmente pertenecen a Stack Overflow.
Gilles 'SO- deja de ser malvado'

Respuestas:


31

La forma estándar de iniciar sesión desde un programa en C es syslog.

Comience por incluir el archivo de encabezado:

#include <syslog.h>

Luego, al principio de su programa, debe configurar syslog llamando a openlog:

openlog("programname", 0, LOG_USER);

El primer argumento es la identificación o la etiqueta, que se agrega automáticamente al comienzo de cada mensaje. Pon el nombre de tu programa aquí.

El segundo argumento son las opciones que desea utilizar, o 0para el comportamiento normal. La lista completa de opciones está en man 3 syslog. Uno que puede encontrar útil es LOG_PIDque hace que syslog también registre la identificación del proceso en el mensaje de registro.

Luego, cada vez que desee escribir un mensaje de registro, llame a syslog:

syslog(LOG_INFO, "%s", "Message");

El primer argumento es la prioridad. Los rangos de prioridad de DEBUG(menos importante) a EMERG(sólo para emergencias) con DEBUG, INFOy ERRse utilizan los más comúnmente. Ver man 3 syslogpara sus opciones.

Los argumentos segundo y tercero son un formato y un mensaje, al igual que printf.

En qué archivo de registro aparece esto depende de la configuración de syslog.

Con una configuración predeterminada, probablemente entra /var/log/messages.


Puede configurar un archivo de registro personalizado utilizando una de las instalaciones en el rango LOG_LOCAL0de LOG_LOCAL7.

Los usas cambiando:

openlog("programname", 0, LOG_USER);

a

openlog("programname", 0, LOG_LOCAL0);

o

openlog("programname", 0, LOG_LOCAL1);

etc.

y agregando una entrada correspondiente a /etc/syslog.conf, por ejemplo

local1.info /var/log/programname.log

y reiniciar el servidor syslog, p. ej.

pkill -HUP syslogd

La .infoparte de local1.infomedios anteriores que todos los mensajes que son INFOo más importante será registrada, incluyendo INFO, NOTICE, ERR(error), CRIT(crítico), etc., pero no DEBUG.


O, si lo ha hecho rsyslog, puede probar un filtro basado en propiedades , p. Ej.

:syslogtag, isequal, "programname:"    /var/log/programname.log

El syslogtag debe contener un ":".

O bien, si planea distribuir su software a otras personas, probablemente no sea una buena idea confiar en el uso LOG_LOCALo en un rsyslogfiltro.

En ese caso, debe usar LOG_USER(si es un programa normal) o LOG_DAEMON(si es un servidor), escribir sus mensajes de inicio y mensajes de error usando syslog, pero escribir todos sus mensajes de registro en un archivo externo syslog. Por ejemplo, Apache HTTPd inicia sesión en /var/log/apache2/*o /var/log/httpd/*, supongo que usa llamadas regulares open/ fopeny write/ printf.


Gracias. Esta es una información bastante útil. Pero, ¿podría explicar más sobre la opción log_local0-7? Por ej. Quiero escribir mis datos (que tienen una palabra <self> en la línea de registro) en el archivo self.log. y algunos registros en otros archivos.
Sushant Jain

@Sushant Jain: ¿A qué distribución y versión de Linux estás apuntando? ¿Tiene syslog antiguo (ksyslogd) o rsyslog? rpm -qa | grep syslogo dpkg -l '*syslog*'probablemente te dirá cuál.
Mikel

log_local * son, francamente, reliquias de cuando sysklogdera el único juego en la ciudad para el software syslog. Hoy en día el software como syslog-ng, rsyslogy dsyslogexisten y tienen capacidades de filtrado mucho más sofisticados que acaba de servicio / nivel.
Shadur

Muchas gracias. Mi problema ha sido resuelto. Tengo una consulta más sobre el análisis de datos almacenados en el archivo de registro. ¿Hay alguna buena manera de hacerlo? En realidad estoy tratando de hacer una herramienta de estadísticas del sistema. Entonces lo necesito.
Sushant Jain

@Sushant Jain. Encantado de ayudar. Publique su pregunta de análisis de registro como una pregunta separada para que las personas puedan verla y proporcionar las respuestas adecuadas.
Mikel

2

Usted querrá #include <syslog.h>, luego use las syslog()funciones para enviar datos a cualquier programa de registro del sistema que esté activo.

Vea la página del manual aquí .


La función syslog () escribe datos en / var / log / syslog. mientras que quiero escribir registros en mi propio archivo.
Sushant Jain

Como Mikel explica a continuación , puede etiquetar sus mensajes de registro de tal manera que syslog entienda qué programa es, luego configure syslog para escribir sus mensajes de registro de programas en un archivo diferente.
Caleb

1

Hay muchas posibilidades, ¿cuál es tu plan? ¿Solo necesita una opción para iniciar sesión desde la línea de comandos? Echa un vistazo a logger(incluido en bsdutils ). Sólo tipo:

usr@srv % logger test

y registrará algo como esto en su /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

véase también man logger. Dependiendo de su demonio de registro, puede ordenar estos mensajes en archivos específicos o filtrarlos por prioridad.

También hay algunas soluciones para diferentes lenguajes de programación, así que dígame qué quiere hacer ;-)


En realidad quiero hacerlo usando lenguaje c. y tengo información en mikel post.
Sushant Jain

1

El filtrado por nombre de programa se escribe de manera diferente a lo mencionado anteriormente, para versiones recientes de rsyslog(la versión en mi máquina es 5.8.6) como se muestra a continuación:

if $programname == 'popa3d' then /var/log/popa3d.log

Para más información, mira aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.