Servidor de procesamiento de parámetros de variable de función y registro de servidor de notas de código fuente de Redis.c

Prefacio

Varias funciones relacionadas con el registro se definen en la Redis código fuente para imprimir diferentes niveles de información a diferentes ubicaciones (archivo de registro o la salida estándar, dependiendo de la configuración del archivo de configuración). Las definiciones de estas funciones se encuentran en  server.h  y servidor El archivo .c  incluye:

1 void serverLog (nivel int, const char * fmt, ...); 
2 void serverLogRaw (nivel int, const char * msg); 
3 void serverLogFromHandler (nivel int, const char * msg);

Entre ellos, serverLogRaw () es la implementación subyacente de serverLog (). La diferencia es que serverLog () simplemente está encapsulado en el nivel superior para admitir la impresión de cadenas visuales, mientras que serverLogRaw () solo recibe cadenas completas para imprimir.

Redis Logging define cuatro niveles de registro, de menor a mayor: depuración, detallado, atención y advertencia . La definición de macro correspondiente es la siguiente:

1 / * Niveles de registro * / 
2 #define LL_DEBUG 0 
3 #define LL_VERBOSE 1 
4 #define LL_NOTICE 2 
5 #define LL_WARNING 3 
6 #define LL_RAW (1 << 10) / * Modificador para registrar sin marca de tiempo * /

serverLog ()

La función serverLog () proporciona un soporte de impresión de registros similar a printf , que puede admitir cadenas formateadas y recibir parámetros variables.

void serverLog(int level, const char *fmt, ...) {
    va_list ap;
    char msg[LOG_MAX_LEN];

    if ((level&0xff) < server.verbosity) return;

    va_start(ap, fmt);
    vsnprintf(msg, sizeof(msg), fmt, ap);
    va_end(ap);

    serverLogRaw(level,msg);
}

El nivel de impresión del registro se controla en la función. El registro se imprimirá solo cuando el nivel de registro dado no sea menor que el nivel establecido por el servidor, de lo contrario, la función regresa por adelantado.
Las funciones como va_list, va_start y va_end se utilizan para admitir parámetros variables. El principio es utilizar la disposición del espacio de los parámetros de función en la pila. La disposición del espacio de la pila y las operaciones va_list son las siguientes:

 

 La función int vsnprintf (char * s, size_t n, const char * format, va_list arg) usa una lista de parámetros variables para formatear la cadena y guarda la cadena en  el espacio señalado por .

 

serverLogRaw ()

La función serverLogRaw () es la implementación subyacente de la impresión de registros, que controla principalmente los siguientes aspectos de la impresión de registros:

 

 

  • Nivel de registro.   Si el nivel dado es menor que el nivel server.verbosity establecido por el servidor, el registro no se genera y la función regresa directamente.
  • Ubicación de impresión del registro. Si el servidor está configurado con server.logfile, el registro se imprimirá en el archivo de registro correspondiente. De lo contrario, emita directamente a la salida estándar.
  • Formato de impresión de registros. Si el bit original se establece en el nivel de registro, solo se imprime la información de la cadena original. De lo contrario, se agregará información como el número de proceso y la fecha al comienzo de la cadena.
  • void serverLogRaw(int level, const char *msg) {
        // Defined in syslog.h
        const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING };
        const char *c = ".-*#";
        FILE *fp;
        char buf[64];
        int rawmode = (level & LL_RAW);
        int log_to_stdout = server.logfile[0] == '\0';
    
        level &= 0xff; /* clear flags */
        if (level < server.verbosity) return;
    
        fp = log_to_stdout ? stdout : fopen(server.logfile,"a");
        if (!fp) return;
    
        // log without timestamp
        if (rawmode) {
            fprintf(fp,"%s",msg);
        } else {
            int off;
            struct timeval tv;
            int role_char;
            pid_t pid = getpid();
    
            gettimeofday(&tv,NULL);
            struct tm tm;
            /*
             * 自定义的localtime函数
             * 标准的 localtime 在多线程下可能出现死锁的情况
             */
            nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
            off = strftime(buf,sizeof(buf),"%d %b %Y %H:%M:%S.",&tm);
            snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000);
            if (server.sentinel_mode) {
              role_char = 'X'; /* Sentinel. */
           } else if (pid != server.pid) {
              role_char = 'C'; /* RDB / AOF writing child. */
           } else {
              role_char = (server.masterhost ? 'S':'M'); /* Slave or Master. */
           }
          /*
           * 依次存放:
           * pid, X/C/S/M, time, .-*#, msg
           */
          fprintf(fp,"%d:%c %s %c %s\n",
          (int)getpid(),role_char, buf,c[level],msg);
        }
        fflush(fp);
    
        if (!log_to_stdout) fclose(fp);
        if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg);
    }

    Para las impresiones de registros que contienen información de tiempo, se agregará la siguiente información al comienzo de la cadena:

  • Número de proceso del servidor
  • X / C / S / M : refleja el estado del proceso actual, proceso maestro / proceso esclavo / proceso secundario Sentinel / RDB / AOF
    • Fecha formateada
    • Personajes que representan diferentes niveles de registro
    • Cadena de información
    • Ejemplo de impresión de registros:
    • 2084:C 10 Sep 16:06:35.518 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
      2084:C 10 Sep 16:06:35.518 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=2084, just started
      2084:C 10 Sep 16:06:35.518 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
      2084:M 10 Sep 16:06:35.519 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
      2084:M 10 Sep 16:06:35.519 # Server can't set maximum open files to 10032 because of OS error: Invalid argument.
      2084:M 10 Sep 16:06:35.519 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
                      _._
                 _.-``__ ''-._
            _.-``    `.  `_.  ''-._           Redis 4.0.9 (00000000/0) 64 bit
        .-`` .-```.  ```\/    _.,_ ''-._
       (    '      ,       .-`  | `,    )     Running in standalone mode
       |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
       |    `-._   `._    /     _.-'    |     PID: 2084
        `-._    `-._  `-./  _.-'    _.-'
       |`-._`-._    `-.__.-'    _.-'_.-'|
       |    `-._`-._        _.-'_.-'    |           http://redis.io
        `-._    `-._`-.__.-'_.-'    _.-'
       |`-._`-._    `-.__.-'    _.-'_.-'|
       |    `-._`-._        _.-'_.-'    |
        `-._    `-._`-.__.-'_.-'    _.-'
            `-._    `-.__.-'    _.-'
                `-._        _.-'
                    `-.__.-'
      
      2084:M 10 Sep 16:06:35.523 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
      2084:M 10 Sep 16:06:35.523 # Server initialized
      2084:M 10 Sep 16:06:35.523 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
      2084:M 10 Sep 16:06:35.525 * DB loaded from disk: 0.002 seconds
      2084:M 10 Sep 16:06:35.525 * Ready to accept connections

      nolocks_localtime ()

      Vale la pena mencionar que al convertir la hora, el código fuente de Redis tiene en cuenta el problema de interbloqueo que puede ocurrir en el localtime () estándar bajo multi-threading, por lo que se usa una función personalizada nolocks_localtime () sin bloqueo para completar Conversión de formato de hora.

Supongo que te gusta

Origin blog.csdn.net/a159357445566/article/details/108602577
Recomendado
Clasificación