J Reece Wilson
fd0c5b51b2
[+] Begin work on IO futexes for io release on process/thread exit [+] Linux ::readdir iteration [+] AuConsole buffering API [*] Fix sleep as to not get interrupted by signals [*] Switch the type of FS lock used under Linux [*] Linux: Use new IPCHandle encoding scheme [*] Fix undefined behaviour: unintialized timeout values (AuLoop/Linux) [*] Fix undefined behaviour: ConsoleTTY clear line was called of a color of a random value on stack [-] Remainings of std dir iterator [*] Fix pthread_kill (aka send signal to pthread handle) always kills process. This is what you expect bc signal handler inheritance. [*] Reformat the build Aurora.json file [+] Added clang warning ignores to the build file [*] Fix: UNIX need to use STDOUT_FILENO. Was using CRT handle in place of fd by mistake. [+] Linux implementation for IO yield (AuIO::IOYield() - UNIX::LinuxOverlappedYield()) [*] Fix: Linux async end of stream processing. res 0 = zero bytes consumed. <= was detecting this as an error of code 0. Should succeed with zero bytes. [+] Linux LoopQueue missing epilogue hook for the IO processor [*] Various refactors and minor bug fixes [*] Linux fix: Handle pipe EOS as zero [*] Linux fix: thread termination via a user signal of 77. Need a force terminate. [*] IPC handle: fix improper int to bool cast in the header setup within ToString [*] Linux fix: HWInfo CPU topology regression [-] Linux fix: remove SIGABRT handler [*] Missing override in compression, exit, and consoletty headers. [+] Unix Syslog logger backend
114 lines
2.7 KiB
C++
114 lines
2.7 KiB
C++
/***
|
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
|
|
File: SysLog.Unix.cpp
|
|
Date: 2022-8-2
|
|
Author: Reece
|
|
***/
|
|
#include <Source/RuntimeInternal.hpp>
|
|
#include "SysLog.Unix.hpp"
|
|
#include <syslog.h>
|
|
|
|
namespace Aurora::Logging::Sinks
|
|
{
|
|
SysLogSink::SysLogSink(const AuString &value)
|
|
{
|
|
::openlog(value.c_str(), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
|
|
}
|
|
|
|
SysLogSink::~SysLogSink()
|
|
{
|
|
::closelog();
|
|
}
|
|
|
|
bool SysLogSink::OnMessageNonblocking(AuUInt8 level, const ConsoleMessage &msg)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void SysLogSink::OnMessageBlocking(AuUInt8 level, const ConsoleMessage &msg)
|
|
{
|
|
AuUInt type {};
|
|
AU_LOCK_GUARD(this->spinLock_);
|
|
|
|
switch (level)
|
|
{
|
|
case (AuUInt8)ELogLevel::eInfo:
|
|
type = LOG_INFO;
|
|
break;
|
|
case (AuUInt8)ELogLevel::eError:
|
|
type = LOG_CRIT;
|
|
break;
|
|
case (AuUInt8)ELogLevel::eDebug:
|
|
type = LOG_DEBUG;
|
|
break;
|
|
case (AuUInt8)ELogLevel::eVerbose:
|
|
type = LOG_NOTICE;
|
|
break;
|
|
case (AuUInt8)ELogLevel::eWarn:
|
|
type = LOG_WARNING;
|
|
break;
|
|
default:
|
|
type = LOG_INFO;
|
|
break;
|
|
}
|
|
|
|
if (this->sysCurrentType_ != type)
|
|
{
|
|
FlushStrings();
|
|
this->sysCurrentType_ = type;
|
|
}
|
|
|
|
auto a = msg.ToPersistentString();
|
|
if (this->sysStrBuffer_.size() + a.size() + 2 >= 32 * 1000)
|
|
{
|
|
FlushStrings();
|
|
}
|
|
|
|
this->sysStrBuffer_.insert(this->sysStrBuffer_.end(), a.begin(), a.end());
|
|
this->sysStrBuffer_.insert(this->sysStrBuffer_.end(), L"\n", L"\n" + 1);
|
|
}
|
|
|
|
void SysLogSink::FlushStrings()
|
|
{
|
|
if (this->sysStrBuffer_.empty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
this->sysCompleteLineBuffer_.push_back(AuMakeTuple(this->sysCurrentType_, AuMove(this->sysStrBuffer_)));
|
|
this->sysStrBuffer_.clear();
|
|
this->sysStrBuffer_.reserve(15 * 1024);
|
|
}
|
|
|
|
void SysLogSink::OnFlush()
|
|
{
|
|
AU_LOCK_GUARD(this->spinLock_);
|
|
|
|
FlushStrings();
|
|
|
|
for (auto &[level, message] : this->sysCompleteLineBuffer_)
|
|
{
|
|
::syslog(level, "%s", message.c_str());
|
|
}
|
|
|
|
this->sysCompleteLineBuffer_.clear();
|
|
}
|
|
|
|
IBasicSink *NewOSNamedEventDirectorySinkNew(const AuString &name)
|
|
{
|
|
try
|
|
{
|
|
return _new SysLogSink(name);
|
|
}
|
|
catch (...)
|
|
{
|
|
return {};
|
|
}
|
|
}
|
|
|
|
void NewOSNamedEventDirectorySinkRelease(IBasicSink *sink)
|
|
{
|
|
AuSafeDelete<SysLogSink *>(sink);
|
|
}
|
|
} |