src/core/ngx_log.h - nginx-1.7.10

Data types defined

Functions defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_LOG_H_INCLUDED_
  6. #define _NGX_LOG_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>


  9. #define NGX_LOG_STDERR            0
  10. #define NGX_LOG_EMERG             1
  11. #define NGX_LOG_ALERT             2
  12. #define NGX_LOG_CRIT              3
  13. #define NGX_LOG_ERR               4
  14. #define NGX_LOG_WARN              5
  15. #define NGX_LOG_NOTICE            6
  16. #define NGX_LOG_INFO              7
  17. #define NGX_LOG_DEBUG             8

  18. #define NGX_LOG_DEBUG_CORE        0x010
  19. #define NGX_LOG_DEBUG_ALLOC       0x020
  20. #define NGX_LOG_DEBUG_MUTEX       0x040
  21. #define NGX_LOG_DEBUG_EVENT       0x080
  22. #define NGX_LOG_DEBUG_HTTP        0x100
  23. #define NGX_LOG_DEBUG_MAIL        0x200
  24. #define NGX_LOG_DEBUG_MYSQL       0x400

  25. /*
  26. * do not forget to update debug_levels[] in src/core/ngx_log.c
  27. * after the adding a new debug level
  28. */

  29. #define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE
  30. #define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_MYSQL
  31. #define NGX_LOG_DEBUG_CONNECTION  0x80000000
  32. #define NGX_LOG_DEBUG_ALL         0x7ffffff0


  33. typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);
  34. typedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level,
  35.     u_char *buf, size_t len);


  36. struct ngx_log_s {
  37.     ngx_uint_t           log_level;
  38.     ngx_open_file_t     *file;

  39.     ngx_atomic_uint_t    connection;

  40.     time_t               disk_full_time;

  41.     ngx_log_handler_pt   handler;
  42.     void                *data;

  43.     ngx_log_writer_pt    writer;
  44.     void                *wdata;

  45.     /*
  46.      * we declare "action" as "char *" because the actions are usually
  47.      * the static strings and in the "u_char *" case we have to override
  48.      * their types all the time
  49.      */

  50.     char                *action;

  51.     ngx_log_t           *next;
  52. };


  53. #define NGX_MAX_ERROR_STR   2048


  54. /*********************************/

  55. #if (NGX_HAVE_C99_VARIADIC_MACROS)

  56. #define NGX_HAVE_VARIADIC_MACROS  1

  57. #define ngx_log_error(level, log, ...)                                        \
  58.     if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)

  59. void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
  60.     const char *fmt, ...);

  61. #define ngx_log_debug(level, log, ...)                                        \
  62.     if ((log)->log_level & level)                                             \
  63.         ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)

  64. /*********************************/

  65. #elif (NGX_HAVE_GCC_VARIADIC_MACROS)

  66. #define NGX_HAVE_VARIADIC_MACROS  1

  67. #define ngx_log_error(level, log, args...)                                    \
  68.     if ((log)->log_level >= level) ngx_log_error_core(level, log, args)

  69. void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
  70.     const char *fmt, ...);

  71. #define ngx_log_debug(level, log, args...)                                    \
  72.     if ((log)->log_level & level)                                             \
  73.         ngx_log_error_core(NGX_LOG_DEBUG, log, args)

  74. /*********************************/

  75. #else /* NO VARIADIC MACROS */

  76. #define NGX_HAVE_VARIADIC_MACROS  0

  77. void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
  78.     const char *fmt, ...);
  79. void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
  80.     const char *fmt, va_list args);
  81. void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,
  82.     const char *fmt, ...);


  83. #endif /* VARIADIC MACROS */


  84. /*********************************/

  85. #if (NGX_DEBUG)

  86. #if (NGX_HAVE_VARIADIC_MACROS)

  87. #define ngx_log_debug0(level, log, err, fmt)                                  \
  88.         ngx_log_debug(level, log, err, fmt)

  89. #define ngx_log_debug1(level, log, err, fmt, arg1)                            \
  90.         ngx_log_debug(level, log, err, fmt, arg1)

  91. #define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \
  92.         ngx_log_debug(level, log, err, fmt, arg1, arg2)

  93. #define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \
  94.         ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)

  95. #define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \
  96.         ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)

  97. #define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \
  98.         ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)

  99. #define ngx_log_debug6(level, log, err, fmt,                                  \
  100.                        arg1, arg2, arg3, arg4, arg5, arg6)                    \
  101.         ngx_log_debug(level, log, err, fmt,                                   \
  102.                        arg1, arg2, arg3, arg4, arg5, arg6)

  103. #define ngx_log_debug7(level, log, err, fmt,                                  \
  104.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \
  105.         ngx_log_debug(level, log, err, fmt,                                   \
  106.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7)

  107. #define ngx_log_debug8(level, log, err, fmt,                                  \
  108.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \
  109.         ngx_log_debug(level, log, err, fmt,                                   \
  110.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)


  111. #else /* NO VARIADIC MACROS */

  112. #define ngx_log_debug0(level, log, err, fmt)                                  \
  113.     if ((log)->log_level & level)                                             \
  114.         ngx_log_debug_core(log, err, fmt)

  115. #define ngx_log_debug1(level, log, err, fmt, arg1)                            \
  116.     if ((log)->log_level & level)                                             \
  117.         ngx_log_debug_core(log, err, fmt, arg1)

  118. #define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \
  119.     if ((log)->log_level & level)                                             \
  120.         ngx_log_debug_core(log, err, fmt, arg1, arg2)

  121. #define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \
  122.     if ((log)->log_level & level)                                             \
  123.         ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)

  124. #define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \
  125.     if ((log)->log_level & level)                                             \
  126.         ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)

  127. #define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \
  128.     if ((log)->log_level & level)                                             \
  129.         ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)

  130. #define ngx_log_debug6(level, log, err, fmt,                                  \
  131.                        arg1, arg2, arg3, arg4, arg5, arg6)                    \
  132.     if ((log)->log_level & level)                                             \
  133.         ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)

  134. #define ngx_log_debug7(level, log, err, fmt,                                  \
  135.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \
  136.     if ((log)->log_level & level)                                             \
  137.         ngx_log_debug_core(log, err, fmt,                                     \
  138.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7)

  139. #define ngx_log_debug8(level, log, err, fmt,                                  \
  140.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \
  141.     if ((log)->log_level & level)                                             \
  142.         ngx_log_debug_core(log, err, fmt,                                     \
  143.                        arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)

  144. #endif

  145. #else /* NO NGX_DEBUG */

  146. #define ngx_log_debug0(level, log, err, fmt)
  147. #define ngx_log_debug1(level, log, err, fmt, arg1)
  148. #define ngx_log_debug2(level, log, err, fmt, arg1, arg2)
  149. #define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)
  150. #define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)
  151. #define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)
  152. #define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
  153. #define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \
  154.                        arg6, arg7)
  155. #define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \
  156.                        arg6, arg7, arg8)

  157. #endif

  158. /*********************************/

  159. ngx_log_t *ngx_log_init(u_char *prefix);
  160. void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);
  161. void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);
  162. u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);
  163. ngx_int_t ngx_log_open_default(ngx_cycle_t *cycle);
  164. ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle);
  165. ngx_log_t *ngx_log_get_file_log(ngx_log_t *head);
  166. char *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head);


  167. /*
  168. * ngx_write_stderr() cannot be implemented as macro, since
  169. * MSVC does not allow to use #ifdef inside macro parameters.
  170. *
  171. * ngx_write_fd() is used instead of ngx_write_console(), since
  172. * CharToOemBuff() inside ngx_write_console() cannot be used with
  173. * read only buffer as destination and CharToOemBuff() is not needed
  174. * for ngx_write_stderr() anyway.
  175. */
  176. static ngx_inline void
  177. ngx_write_stderr(char *text)
  178. {
  179.     (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text));
  180. }


  181. extern ngx_module_t  ngx_errlog_module;
  182. extern ngx_uint_t    ngx_use_stderr;


  183. #endif /* _NGX_LOG_H_INCLUDED_ */