2011-06-28 21 views
10

Estoy buscando una biblioteca de registro productiva y simple para C, que puede generar el registro en un archivo. Representación de avisos en el registro Quiero hacer así:Biblioteca de registro para C

date-time tag message 

Sería bueno para controlar el nivel de detalle de los mensajes y controlar el tamaño del archivo.

Encontré dos proyectos que son adecuados para mí. Es log4c y nglogc.

log4c parecía demasiado grande. nglogc bastante adecuado, pero también tiene un funcional redundante. tal vez me dices más variantes?

+7

Si eso es todo lo que necesitas, ¿qué hay de malo con un simple contenedor alrededor de 'fprintf'? –

Respuesta

13

Puede utilizar esta

Archivo logger.h

#ifndef LOGGER_H 
#define LOGGER_H 

void logger(const char* tag, const char* message); 

#endif /* LOG_H */ 

logger.c Archivo

#include "logger.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

void logger(const char* tag, const char* message) { 
    time_t now; 
    time(&now); 
    printf("%s [%s]: %s\n", ctime(&now), tag, message); 
} 

Es probablemente no es perfecto, pero satisface las necesidades a medida que los haya presentado .

+1

¿Qué hay de iniciar sesión en un archivo? :) – pmg

+0

Estoy buscando la capacidad de salida en el archivo de registro. Corregí la pregunta de que esto sea más comprensible – trafalgarx

+0

¡simplemente use 'fprintf' en lugar de' printf' arriba! –

0

También estoy buscando soluciones a este problema. La respuesta de @ edwin-buck es simple y está bien para mi necesidad.

Realmente no sé nada sobre multi-threading y thread-safe, pero después de compilar bajo el compilador de Visual Studio (puede dar algunas advertencias y consejos) y buscar a través de google, creo que algunas modificaciones pueden hacer que el código -seguro y mejor.

// file log.c 
void log(const char* tag, const char* message) { 
    time_t now; 
    struct tm _calendar_time; 
    char _buf[MAX_COUNT]; 

    time(&now); 
    localtime_s(&_calendar_time, &now); 

    strftime(_buf, MAX_COUNT, "%c", &_calendar_time); 
    printf("%s [%s]: %s\n", _buf, tag, message); 
} 

dude en corregirme si mal.

10

Sugiero la biblioteca de registro escrita por mí mismo --- zlog!

La forma para adaptarse a su necesidad en zlog es:

$ vi /etc/zlog.conf 
[formats] 
simple = "%D %c %m%n" 
# don't know what the tag mean in your question, so put category of zlog instead 
# log level is also available here, add %V means level 

[rules] 
my_cat.* "xxx.log"; simple 

$ vi hello.c 
#include <stdio.h> 
#include "zlog.h" 

int main(int argc, char** argv) 
{ 
int rc; 
zlog_category_t *c; 

rc = dzlog_init("/etc/zlog.conf", "my_cat"); 
if (rc) { 
    printf("init failed\n"); 
    return -1; 
} 

zlog_info(c, "hello, zlog"); 

zlog_fini(); 

return 0; 
} 

va a generar xxx.log en el directorio actual como

2012-09-30 07:22:50 my_cat hello, zlog 

Enlaces:

Descargar: https://github.com/HardySimpson/zlog/archive/latest-stable.tar.gz

UsersGuide: http://hardysimpson.github.com/zlog/UsersGuide-EN.html

Clasificar: http://hardysimpson.github.com/zlog/

+0

Hola @HardySimpson, recibí "init failed" return 255 cuando corrí Hola C. Entonces, ¿dónde está el archivo de mensaje de registro que puedo encontrar en zlog_init, zc_debug (".... zlog_init start ...."); –

3
Here is mine: 

log.h 
------ 

#ifndef LOG_H 
#define LOG_H 


void log_error(const char* message, ...); void log_info(const char* message, ...); void log_debug(const char* message, ...); 

#endif 

log.c 
------ 
#include "log.h" 


void log_format(const char* tag, const char* message, va_list args) { time_t now;  time(&now);  char * date =ctime(&now); date[strlen(date) - 1] = '\0'; printf("%s [%s] ", date, tag); vprintf(message, args);  printf("\n"); } 

void log_error(const char* message, ...) { va_list args; va_start(args, message); log_format("error", message, args);  va_end(args); } 

void log_info(const char* message, ...) { va_list args; va_start(args, message); log_format("info", message, args); va_end(args); } 

void log_debug(const char* message, ...) { va_list args; va_start(args, message); log_format("debug", message, args);  va_end(args); } 

Que se diviertan!

+1

Esto no es necesariamente una mala respuesta, pero la pregunta ya tenía una aceptada desde 2011. No es muy constructivo responder preguntas tan antiguas a menos que tenga información que beneficie significativamente a un lector. –

4

Se puede usar esta biblioteca simple registro: https://github.com/kala13x/slog

Aquí hay un ejemplo de cómo utilizar:

Al principio debes acceder init. con la función init_log().El primer argumento es el nombre de archivo de registro, segundo argumento es conectarse a un archivo (1 habilitado, 0 desactivado) y el tercer argumento es el nivel de registro máximo

init_slog("example", 1, 3); 

impresión y registrar algo

slog(0, "Test message with level 0"); 
slog(2, "Test message with level 2"); 
slog(0, "Test message with int argument: %d", int_arg); 

Outout habrá algo por el estilo :

2015: 04: 02: 56 - mensaje de prueba con el nivel de 0
2015: 04: 02: 56 - mensaje de prueba con el nivel 2
2015: 04: 02: 56 - Mensaje de prueba con argumento int: 69

+1

¡Una de las mejores bibliotecas! – Steven

2

Eche un vistazo a la biblioteca de registro zf_log. Es pequeño, simple y proporciona elementos esenciales solamente. De README.md:

Esto es solo una envoltura delgada alrededor de la función sprintf(). Proporciona menos del 20% de la funcionalidad que se encuentra en las bibliotecas más sofisticadas, pero cubre más del 80% de los casos de uso común. El enfoque se basa en la simplicidad, la facilidad de uso y el rendimiento (para ser más precisos, con una baja sobrecarga).

Características:

  • registro de depuración se reduce a no-op en la construcción de las versiones
  • Los argumentos no son evaluados cuando el mensaje no se registra
  • Sin advertencia "sin usar" para las variables utilizadas en las declaraciones de registro Sólo
  • registrar una región de memoria como HEX y ASCII
  • funciones de salida personalizado
Cuestiones relacionadas