diff options
author | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2013-06-28 16:18:18 +0200 |
---|---|---|
committer | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2013-07-25 13:09:07 +0200 |
commit | fd6c274685e5fd66506f29dece45032650ce6a92 (patch) | |
tree | e621ab156449f2dbaefb7c965806ac28e1575df4 /src/system/dlt-system-journal.c | |
parent | 277fca175316e182b5a1f1b854e6a0bc11654d6e (diff) | |
download | DLT-daemon-fd6c274685e5fd66506f29dece45032650ce6a92.tar.gz |
First version of journal support.
Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
Diffstat (limited to 'src/system/dlt-system-journal.c')
-rw-r--r-- | src/system/dlt-system-journal.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/system/dlt-system-journal.c b/src/system/dlt-system-journal.c new file mode 100644 index 0000000..e5419d3 --- /dev/null +++ b/src/system/dlt-system-journal.c @@ -0,0 +1,166 @@ +/** + * @licence app begin@ + * Copyright (C) 2013 BMW AG + * + * This file is part of GENIVI Project Dlt - Diagnostic Log and Trace console apps. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * + * \author Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> BMW 2013 + * + * \file dlt-system-journal.c + * For further information see http://www.genivi.org/. + * @licence end@ + */ + +/******************************************************************************* +** ** +** SRC-MODULE: dlt-system-journal.c ** +** ** +** TARGET : linux ** +** ** +** PROJECT : DLT ** +** ** +** AUTHOR : Alexander Wenzel Alexander.AW.Wenzel@bmw.de ** +** ** +** PURPOSE : ** +** ** +** REMARKS : ** +** ** +** PLATFORM DEPENDANT [yes/no]: yes ** +** ** +** TO BE CHANGED BY USER [yes/no]: no ** +** ** +*******************************************************************************/ +#if defined(DLT_SYSTEMD_JOURNAL_ENABLE) + +#include <pthread.h> +#include <unistd.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <strings.h> +#include <errno.h> + +#include "dlt-system.h" + +#include <systemd/sd-journal.h> + +extern DltSystemThreads threads; + +DLT_IMPORT_CONTEXT(dltsystem) +DLT_DECLARE_CONTEXT(journalContext) + +int journal_checkUserBufferForFreeSpace() +{ + int total_size, used_size; + + dlt_user_check_buffer(&total_size, &used_size); + + if((total_size - used_size) < (total_size/2)) + { + return -1; + } + return 1; +} + +void journal_thread(void *v_conf) +{ + int r,r2,r3,r4,r5; + sd_journal *j; + + DLT_LOG(dltsystem, DLT_LOG_DEBUG, + DLT_STRING("dlt-system-journal, in thread.")); + + DltSystemConfiguration *conf = (DltSystemConfiguration *) v_conf; + DLT_REGISTER_CONTEXT(journalContext, conf->Journal.ContextId, "Journal Adapter"); + + r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_RUNTIME_ONLY); + if (r < 0) { + DLT_LOG(dltsystem, DLT_LOG_ERROR, + DLT_STRING("dlt-system-journal, cannot open journal.")); + return; + } + + // Uncomment if only new jornal entries should be shown + //sd_journal_seek_tail(j); + + /* possible mapping of log levels */ + /* journal log levels + 0 Emergency DLT_LOG_CRITICAL + 1 Alert DLT_LOG_CRITICAL + 2 Critical DLT_LOG_CRITICAL + 3 Error DLT_LOG_ERROR + 4 Warning DLT_LOG_WARNING + 5 Notice DLT_LOG_WARNING + 6 Informational DLT_LOG_INFO + 7 Debug DLT_LOG_DEBUG + */ + + while(!threads.shutdown) + { + const char *d2="",*d3="",*d4="",*d5=""; + size_t l; + uint64_t time_usecs = 0; + + // Jun 28 13:34:05 alexvbox systemd[1]: Started GENIVI DLT system. + if(sd_journal_next(j)>0) + { + sd_journal_get_realtime_usec(j, &time_usecs); + r2 = sd_journal_get_data(j, "_COMM",(const void **) &d2, &l); + r3 = sd_journal_get_data(j, "_PID",(const void **) &d3, &l); + r4 = sd_journal_get_data(j, "PRIORITY",(const void **) &d4, &l); + r5 = sd_journal_get_data(j, "MESSAGE",(const void **) &d5, &l); + if(r2>=0 && strlen(d2)>6) d2 +=6; + if(r3>=0 && strlen(d3)>5) d3 +=5; + if(r4>=0 && strlen(d4)>9) d4 +=9; + if(r5>=0 && strlen(d5)>8) d5 +=8; + + if(r5>=0) + { + DLT_LOG(journalContext, DLT_LOG_INFO, + DLT_UINT64(time_usecs),DLT_STRING(d2),DLT_STRING(d3),DLT_STRING(d4),DLT_STRING(d5)); + } + + } + else + { + sd_journal_wait(j,1000000); + } + + if(journal_checkUserBufferForFreeSpace()==-1) + { + // buffer is nearly full + // wait 500ms for writing next entry + struct timespec t; + t.tv_sec = 0; + t.tv_nsec = 1000000ul*500; + nanosleep(&t, NULL); + } + + + } + + sd_journal_close(j); + + DLT_UNREGISTER_CONTEXT(journalContext); + +} + +void start_systemd_journal(DltSystemConfiguration *conf) +{ + DLT_LOG(dltsystem, DLT_LOG_DEBUG, + DLT_STRING("dlt-system-journal, start journal")); + static pthread_attr_t t_attr; + static pthread_t pt; + pthread_create(&pt, &t_attr, (void *)journal_thread, conf); + threads.threads[threads.count++] = pt; +} + +#endif /* DLT_SYSTEMD_JOURNAL_ENABLE */ |