system.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <util/stream/output.h>
  2. #include <util/stream/null.h>
  3. #include <util/system/compat.h>
  4. #include <util/system/yassert.h>
  5. #include <util/system/defaults.h>
  6. #include <util/generic/singleton.h>
  7. #include <util/generic/utility.h>
  8. #if defined(_unix_)
  9. #include <syslog.h>
  10. #endif
  11. #include "system.h"
  12. #include "record.h"
  13. #include "stream.h"
  14. TSysLogBackend::TSysLogBackend(const char* ident, EFacility facility, int flags)
  15. : Ident(ident)
  16. , Facility(facility)
  17. , Flags(flags)
  18. {
  19. #if defined(_unix_)
  20. Y_ASSERT(TSYSLOG_LOCAL0 <= facility && facility <= TSYSLOG_LOCAL7);
  21. static const int f2sf[] = {
  22. LOG_LOCAL0,
  23. LOG_LOCAL1,
  24. LOG_LOCAL2,
  25. LOG_LOCAL3,
  26. LOG_LOCAL4,
  27. LOG_LOCAL5,
  28. LOG_LOCAL6,
  29. LOG_LOCAL7};
  30. int sysflags = LOG_NDELAY | LOG_PID;
  31. if (flags & LogPerror) {
  32. sysflags |= LOG_PERROR;
  33. }
  34. if (flags & LogCons) {
  35. sysflags |= LOG_CONS;
  36. }
  37. openlog(Ident.data(), sysflags, f2sf[(size_t)facility]);
  38. #endif
  39. }
  40. TSysLogBackend::~TSysLogBackend() {
  41. #if defined(_unix_)
  42. closelog();
  43. #endif
  44. }
  45. void TSysLogBackend::WriteData(const TLogRecord& rec) {
  46. #if defined(_unix_)
  47. syslog(ELogPriority2SyslogPriority(rec.Priority), "%.*s", (int)rec.Len, rec.Data);
  48. #else
  49. Y_UNUSED(rec);
  50. #endif
  51. }
  52. void TSysLogBackend::ReopenLog() {
  53. }
  54. int TSysLogBackend::ELogPriority2SyslogPriority(ELogPriority priority) {
  55. #if defined(_unix_)
  56. return Min(int(priority), (int)LOG_PRIMASK);
  57. #else
  58. // trivial conversion
  59. return int(priority);
  60. #endif
  61. }
  62. namespace {
  63. class TSysLogInstance: public TLog {
  64. public:
  65. inline TSysLogInstance()
  66. : TLog(MakeHolder<TStreamLogBackend>(&Cnull))
  67. {
  68. }
  69. };
  70. }
  71. TLog& SysLogInstance() {
  72. return *Singleton<TSysLogInstance>();
  73. }