summaryrefslogtreecommitdiffstats
path: root/ml/dlib/examples/logger_custom_output_ex.cpp
blob: 6916e43de91b70e2c28c4cfadea430206d1e1624 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt

/*

    This is an example showing how to control where the dlib::logger sends its messages.
    This is done by creating a "hook" class that is called whenever any of the loggers want
    to log a message.  The hook class then outputs the messages using any method you like.


    Prior to reading this example, you should understand the basics of the dlib::logger.
    So you should have already read the logger_ex.cpp and logger_ex_2.cpp example programs.

*/


#include <dlib/logger.h>

using namespace dlib;
using namespace std;

class my_hook
{
public:
    my_hook(
    ) 
    {
        fout.open("my_log_file.txt");
    }

    void log (
        const string& logger_name,
        const log_level& ll,
        const uint64 thread_id,
        const char* message_to_log
    )
    {
        // Log all messages from any logger to our log file.
        fout << ll << " ["<<thread_id<<"] " << logger_name << ": " << message_to_log << endl;

        // But only log messages that are of LINFO priority or higher to the console.
        if (ll >= LINFO)
            cout << ll << " ["<<thread_id<<"] " << logger_name << ": " << message_to_log << endl;
    }

private:
    ofstream fout;
};

int main()
{
    my_hook hook;
    // This tells all dlib loggers to send their logging events to the hook object.  That
    // is, any time a logger generates a message it will call hook.log() with the message
    // contents.  Additionally, hook.log() will also only be called from one thread at a
    // time so it is safe to use this kind of hook in a multi-threaded program with many
    // loggers in many threads.
    set_all_logging_output_hooks(hook);
    // It should also be noted that the hook object must not be destructed while the
    // loggers are still in use.  So it is a good idea to declare the hook object 
    // somewhere where it will live the entire lifetime of the program, as we do here.


    logger dlog("main");
    // Tell the dlog logger to emit a message for all logging events rather than its
    // default behavior of only logging LERROR or above. 
    dlog.set_level(LALL);

    // All these message go to my_log_file.txt, but only the last two go to the console.
    dlog << LDEBUG << "This is a debugging message.";
    dlog << LINFO  << "This is an informational message.";
    dlog << LERROR << "An error message!";
}