From 1b5a7dbf79e5cbcb0e99d7d37b87d158cc7a4e6d Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Tue, 20 Jun 2017 11:01:53 -0700 Subject: [PATCH] logging: add a small example program Summary: This adds a small example program which demonstrates using the logging library. This gives a very basic example of how the library is intended to be used, and can also be used to play around with controlling the log levels from the command line argument. Reviewed By: wez Differential Revision: D5083104 fbshipit-source-id: ab09c6c88db33065f6e39f35b28014f2a6153cef --- .gitignore | 1 + folly/configure.ac | 1 + folly/experimental/logging/Makefile.am | 2 +- .../experimental/logging/example/Makefile.am | 9 +++ folly/experimental/logging/example/lib.cpp | 24 ++++++++ folly/experimental/logging/example/lib.h | 37 +++++++++++++ folly/experimental/logging/example/main.cpp | 55 +++++++++++++++++++ 7 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 folly/experimental/logging/example/Makefile.am create mode 100644 folly/experimental/logging/example/lib.cpp create mode 100644 folly/experimental/logging/example/lib.h create mode 100644 folly/experimental/logging/example/main.cpp diff --git a/.gitignore b/.gitignore index 775b535b..08702cce 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ folly/**/test/*_test_using_jemalloc folly/**/test/*.trs folly/config.* folly/configure +folly/experimental/logging/example/logging_example folly/libfolly.pc folly/m4/libtool.m4 folly/m4/ltoptions.m4 diff --git a/folly/configure.ac b/folly/configure.ac index e7c73c85..2d5ca29c 100644 --- a/folly/configure.ac +++ b/folly/configure.ac @@ -608,6 +608,7 @@ AC_CONFIG_FILES([Makefile experimental/Makefile experimental/io/test/Makefile experimental/logging/Makefile + experimental/logging/example/Makefile experimental/symbolizer/Makefile init/Makefile stats/test/Makefile]) diff --git a/folly/experimental/logging/Makefile.am b/folly/experimental/logging/Makefile.am index bd38e611..a758c3f3 100644 --- a/folly/experimental/logging/Makefile.am +++ b/folly/experimental/logging/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . +SUBDIRS = . example lib_LTLIBRARIES = libfollylogging.la diff --git a/folly/experimental/logging/example/Makefile.am b/folly/experimental/logging/example/Makefile.am new file mode 100644 index 00000000..d74ae4d6 --- /dev/null +++ b/folly/experimental/logging/example/Makefile.am @@ -0,0 +1,9 @@ +noinst_PROGRAMS = logging_example +noinst_LTLIBRARIES = libfollylogging_example.la + +logging_example_SOURCES = main.cpp +logging_example_LDADD = libfollylogging_example.la + +libfollylogging_example_la_SOURCES = lib.cpp +libfollylogging_example_la_LIBADD = \ + $(top_builddir)/experimental/logging/libfollylogging.la diff --git a/folly/experimental/logging/example/lib.cpp b/folly/experimental/logging/example/lib.cpp new file mode 100644 index 00000000..7190c707 --- /dev/null +++ b/folly/experimental/logging/example/lib.cpp @@ -0,0 +1,24 @@ +/* + * Copyright 2004-present Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +namespace example { +ExampleObject::~ExampleObject() { + // All XLOG() statements in this file will log to the category + // folly.experimental.logging.example.lib + XLOGF(DBG1, "ExampleObject({}) at {} destroyed", value_, this); +} +} diff --git a/folly/experimental/logging/example/lib.h b/folly/experimental/logging/example/lib.h new file mode 100644 index 00000000..c43a88fc --- /dev/null +++ b/folly/experimental/logging/example/lib.h @@ -0,0 +1,37 @@ +/* + * Copyright 2004-present Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include + +namespace example { + +class ExampleObject { + public: + explicit ExampleObject(folly::StringPiece str) : value_{str.str()} { + // All XLOG() statements in this file will log to the category + // folly.experimental.logging.example.lib + XLOGF(DBG1, "ExampleObject({}) constructed at {}", value_, this); + } + ~ExampleObject(); + + void doStuff(); + + private: + std::string value_; +}; +} diff --git a/folly/experimental/logging/example/main.cpp b/folly/experimental/logging/example/main.cpp new file mode 100644 index 00000000..14d08836 --- /dev/null +++ b/folly/experimental/logging/example/main.cpp @@ -0,0 +1,55 @@ +/* + * Copyright 2004-present Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include + +#include + +DEFINE_string(logging, "", "Logging category configuration string"); + +using namespace example; +using folly::LogLevel; + +// Invoking code that uses XLOG() statements before main is safe, +// but will not log anywhere, since no handlers are configured yet. +static ExampleObject staticInitialized("static"); + +int main(int argc, char* argv[]) { + // Using log macros before configuring any log levels or log handlers is + // safe, but the messages will always be ignore since no handlers are defined. + XLOG(INFO, "no handlers configured yet, so this will go nowhere"); + printf("main starting\n"); + fflush(stdout); + + // Call folly::init() and then initialize log levels and handlers + folly::init(&argc, &argv); + initLoggingGlogStyle(FLAGS_logging, LogLevel::INFO); + + // All XLOG() statements in this file will log to the category + // folly.experimental.logging.example.main + XLOG(INFO, "now log messages will be sent to stderr"); + + XLOG(DBG1, "log arguments are concatenated: ", 12345, ", ", 92.0); + XLOGF(DBG1, "XLOGF supports {}-style formatting: {:.3f}", "python", 1.0 / 3); + XLOG(DBG2) << "streaming syntax is also supported: " << 1234; + XLOG(DBG2, "you can even", " mix function-style") << " and streaming " + << "syntax"; + + ExampleObject("foo"); + XLOG(INFO, "main returning"); + return 0; +} -- 2.34.1