diff --git a/adapters/ds/sinks/always_on_rtsp/__main__.py b/adapters/ds/sinks/always_on_rtsp/__main__.py index e3f30a6c..dd9d195f 100644 --- a/adapters/ds/sinks/always_on_rtsp/__main__.py +++ b/adapters/ds/sinks/always_on_rtsp/__main__.py @@ -16,6 +16,7 @@ from adapters.ds.sinks.always_on_rtsp.zeromq_proxy import ZeroMqProxy from savant.gstreamer import Gst from savant.utils.logging import get_logger, init_logging +from savant.utils.welcome import get_starting_message LOGGER_NAME = 'adapters.ao_sink.entrypoint' logger = get_logger(LOGGER_NAME) @@ -26,6 +27,7 @@ def main(): signal.signal(signal.SIGTERM, signal.getsignal(signal.SIGINT)) init_logging() + logger.info(get_starting_message('always-on-rtsp sink adapter')) config = AppConfig() Gst.init(None) diff --git a/adapters/ds/sinks/display.sh b/adapters/ds/sinks/display.sh index 7b31162f..babcf441 100755 --- a/adapters/ds/sinks/display.sh +++ b/adapters/ds/sinks/display.sh @@ -26,6 +26,8 @@ fi SYNC_OUTPUT="${SYNC_OUTPUT:="false"}" CLOSING_DELAY="${CLOSING_DELAY:="0"}" +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "display sink adapter" gst-launch-1.0 \ savant_rs_video_player "${ZEROMQ_SRC_ARGS[@]}" \ sync="${SYNC_OUTPUT}" closing-delay="${CLOSING_DELAY}" diff --git a/adapters/gst/sinks/video_files.py b/adapters/gst/sinks/video_files.py index 863b8181..aec5614c 100755 --- a/adapters/gst/sinks/video_files.py +++ b/adapters/gst/sinks/video_files.py @@ -16,6 +16,7 @@ from savant.gstreamer.codecs import Codec from savant.utils.config import opt_config, strtobool from savant.utils.logging import get_logger, init_logging +from savant.utils.welcome import get_starting_message from savant.utils.zeromq import ZeroMQMessage, ZeroMQSource LOGGER_NAME = 'adapters.video_files_sink' @@ -373,6 +374,7 @@ def main(): signal.signal(signal.SIGTERM, signal.getsignal(signal.SIGINT)) logger = get_logger(LOGGER_NAME) + logger.info(get_starting_message('video files sink adapter')) dir_location = os.environ['DIR_LOCATION'] zmq_endpoint = os.environ['ZMQ_ENDPOINT'] diff --git a/adapters/gst/sources/ffmpeg.sh b/adapters/gst/sources/ffmpeg.sh index d6b6e4de..a2d87a63 100755 --- a/adapters/gst/sources/ffmpeg.sh +++ b/adapters/gst/sources/ffmpeg.sh @@ -66,6 +66,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "ffmpeg source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/gst/sources/gige_cam.sh b/adapters/gst/sources/gige_cam.sh index b2707e07..9989b61f 100755 --- a/adapters/gst/sources/gige_cam.sh +++ b/adapters/gst/sources/gige_cam.sh @@ -106,6 +106,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "gige-cam source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/gst/sources/media_files.sh b/adapters/gst/sources/media_files.sh index 44d4b1d0..acbcfe3c 100755 --- a/adapters/gst/sources/media_files.sh +++ b/adapters/gst/sources/media_files.sh @@ -80,6 +80,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "media files source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/gst/sources/multi_stream.sh b/adapters/gst/sources/multi_stream.sh index 81dc0cdb..f7bd3342 100755 --- a/adapters/gst/sources/multi_stream.sh +++ b/adapters/gst/sources/multi_stream.sh @@ -92,6 +92,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "multistream source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/gst/sources/rtsp.sh b/adapters/gst/sources/rtsp.sh index 29a82463..dee96473 100755 --- a/adapters/gst/sources/rtsp.sh +++ b/adapters/gst/sources/rtsp.sh @@ -64,6 +64,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "rtsp source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/gst/sources/usb_cam.sh b/adapters/gst/sources/usb_cam.sh index dc401e8d..940ddffe 100755 --- a/adapters/gst/sources/usb_cam.sh +++ b/adapters/gst/sources/usb_cam.sh @@ -56,6 +56,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "usb-cam source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/gst/sources/video_loop.sh b/adapters/gst/sources/video_loop.sh index 2772599b..3733a8c9 100755 --- a/adapters/gst/sources/video_loop.sh +++ b/adapters/gst/sources/video_loop.sh @@ -64,6 +64,8 @@ handler() { } trap handler SIGINT SIGTERM +source "${PROJECT_PATH}/adapters/shared/utils.sh" +print_starting_message "video-loop source adapter" gst-launch-1.0 --eos-on-shutdown "${PIPELINE[@]}" & child_pid="$!" diff --git a/adapters/python/bridge/buffer.py b/adapters/python/bridge/buffer.py index 189b007b..9ed2c1c5 100644 --- a/adapters/python/bridge/buffer.py +++ b/adapters/python/bridge/buffer.py @@ -24,6 +24,7 @@ from savant.metrics.prometheus import BaseMetricsCollector, PrometheusMetricsExporter from savant.utils.config import opt_config from savant.utils.logging import get_logger, init_logging +from savant.utils.welcome import get_starting_message from savant.utils.zeromq import ZeroMQMessage, ZeroMQSource LOGGER_NAME = 'adapters.buffer' @@ -400,10 +401,10 @@ def build_video_pipeline(config: Config): def main(): init_logging() + logger.info(get_starting_message('buffer bridge adapter')) # To gracefully shutdown the adapter on SIGTERM (raise KeyboardInterrupt) signal.signal(signal.SIGTERM, signal.getsignal(signal.SIGINT)) config = Config() - logger.info('Starting the adapter') queue = PersistentQueueWithCapacity( config.buffer.path, config.buffer.len + config.buffer.service_messages, diff --git a/adapters/python/shared/kafka_redis.py b/adapters/python/shared/kafka_redis.py index 55553985..d2609c4e 100644 --- a/adapters/python/shared/kafka_redis.py +++ b/adapters/python/shared/kafka_redis.py @@ -12,6 +12,7 @@ from savant.utils.config import opt_config, strtobool from savant.utils.fps_meter import FPSMeter from savant.utils.logging import get_logger, init_logging +from savant.utils.welcome import get_starting_message LOGGER_NAME = 'adapters.kafka_redis' logger = get_logger(LOGGER_NAME) @@ -221,16 +222,19 @@ def log_fps(self): def run_kafka_redis_adapter( + name: str, adapter_class: Type[BaseKafkaRedisAdapter], config_class: Type[BaseConfig], ): """Run kafka-redis adapter. + :param name: The adapter name. :param adapter_class: The adapter implementation. :param config_class: The configuration implementation. """ init_logging() + logger.info(get_starting_message(name)) # To gracefully shutdown the adapter on SIGTERM (raise KeyboardInterrupt) signal.signal(signal.SIGTERM, signal.getsignal(signal.SIGINT)) source = adapter_class(config_class()) diff --git a/adapters/python/sinks/image_files.py b/adapters/python/sinks/image_files.py index 9a6c822f..e5820cbb 100755 --- a/adapters/python/sinks/image_files.py +++ b/adapters/python/sinks/image_files.py @@ -15,6 +15,7 @@ from savant.api.enums import ExternalFrameType from savant.utils.config import opt_config, strtobool from savant.utils.logging import get_logger, init_logging +from savant.utils.welcome import get_starting_message from savant.utils.zeromq import ZeroMQMessage, ZeroMQSource LOGGER_NAME = 'adapters.image_files_sink' @@ -150,6 +151,7 @@ def main(): signal.signal(signal.SIGTERM, signal.getsignal(signal.SIGINT)) logger = get_logger(LOGGER_NAME) + logger.info(get_starting_message('image files sink adapter')) dir_location = os.environ['DIR_LOCATION'] zmq_endpoint = os.environ['ZMQ_ENDPOINT'] diff --git a/adapters/python/sinks/kafka_redis.py b/adapters/python/sinks/kafka_redis.py index be2c4c67..bbba0d11 100644 --- a/adapters/python/sinks/kafka_redis.py +++ b/adapters/python/sinks/kafka_redis.py @@ -344,4 +344,4 @@ def build_producer(self) -> Producer: if __name__ == '__main__': - run_kafka_redis_adapter(KafkaRedisSink, Config) + run_kafka_redis_adapter('kafka-redis sink adapter', KafkaRedisSink, Config) diff --git a/adapters/python/sinks/metadata_json.py b/adapters/python/sinks/metadata_json.py index 41609d85..648414b0 100755 --- a/adapters/python/sinks/metadata_json.py +++ b/adapters/python/sinks/metadata_json.py @@ -20,6 +20,7 @@ from savant.api.parser import parse_video_frame from savant.utils.config import opt_config, strtobool from savant.utils.logging import get_logger, init_logging +from savant.utils.welcome import get_starting_message from savant.utils.zeromq import ZeroMQMessage, ZeroMQSource LOGGER_NAME = 'adapters.metadata_json_sink' @@ -180,6 +181,7 @@ def main(): signal.signal(signal.SIGTERM, signal.getsignal(signal.SIGINT)) logger = get_logger(LOGGER_NAME) + logger.info(get_starting_message('metadata sink adapter')) location = os.environ['LOCATION'] zmq_endpoint = os.environ['ZMQ_ENDPOINT'] diff --git a/adapters/python/sources/kafka_redis.py b/adapters/python/sources/kafka_redis.py index d7c36160..ebb7d3ac 100644 --- a/adapters/python/sources/kafka_redis.py +++ b/adapters/python/sources/kafka_redis.py @@ -286,4 +286,4 @@ def build_consumer(self) -> Consumer: if __name__ == '__main__': - run_kafka_redis_adapter(KafkaRedisSource, Config) + run_kafka_redis_adapter('kafka-redis source adapter', KafkaRedisSource, Config) diff --git a/adapters/shared/utils.sh b/adapters/shared/utils.sh new file mode 100755 index 00000000..ce7720fe --- /dev/null +++ b/adapters/shared/utils.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +######################## +# Print starting message +# Arguments: +# $1 - the name of starting module or adapter +######################### +function print_starting_message { + local name=${1-} + python3 -c "from savant.utils.welcome import get_starting_message; print(get_starting_message('$name'))" +} diff --git a/docker/Dockerfile.adapters-gstreamer b/docker/Dockerfile.adapters-gstreamer index e7582163..5eb0836a 100644 --- a/docker/Dockerfile.adapters-gstreamer +++ b/docker/Dockerfile.adapters-gstreamer @@ -104,3 +104,5 @@ COPY adapters/gst adapters/gst COPY gst_plugins/python/logger.py adapters/gst/gst_plugins/python/ ENV GST_PLUGIN_PATH=$PROJECT_PATH/adapters/gst/gst_plugins \ LOGLEVEL=info + +RUN echo 'python3 -c "from savant.utils.welcome import get_welcome_message; print(get_welcome_message())"' >> /etc/bash.bashrc diff --git a/docker/Dockerfile.adapters-py b/docker/Dockerfile.adapters-py index 9b657f64..0b6503f0 100644 --- a/docker/Dockerfile.adapters-py +++ b/docker/Dockerfile.adapters-py @@ -29,3 +29,5 @@ COPY savant savant COPY adapters/shared adapters/shared COPY adapters/python adapters/python ENV LOGLEVEL=info + +RUN echo 'python3 -c "from savant.utils.welcome import get_welcome_message; print(get_welcome_message())"' >> /etc/bash.bashrc diff --git a/docker/Dockerfile.deepstream b/docker/Dockerfile.deepstream index fae17911..c9bf761e 100644 --- a/docker/Dockerfile.deepstream +++ b/docker/Dockerfile.deepstream @@ -197,6 +197,8 @@ ENV SAVANT_STATUS_FILEPATH=$PROJECT_PATH/status.txt HEALTHCHECK --interval=5s --timeout=5s --start-period=30m --retries=3 \ CMD [ "sh", "/opt/savant/healthcheck.sh" ] +RUN echo 'python3 -c "from savant.utils.welcome import get_welcome_message; print(get_welcome_message())"' >> /etc/bash.bashrc + ENTRYPOINT ["python", "-m", "savant.entrypoint"] diff --git a/savant/entrypoint/__main__.py b/savant/entrypoint/__main__.py index 3d4d013e..ecfae7a6 100644 --- a/savant/entrypoint/__main__.py +++ b/savant/entrypoint/__main__.py @@ -4,6 +4,7 @@ > echo " name: test-module parameters: + log_level: DEBUG batch_size: 1 " | python -m savant.entrypoint diff --git a/savant/entrypoint/main.py b/savant/entrypoint/main.py index 45eb44c1..24bff174 100644 --- a/savant/entrypoint/main.py +++ b/savant/entrypoint/main.py @@ -18,6 +18,7 @@ from savant.utils.check_display import check_display_env from savant.utils.logging import get_logger, init_logging, update_logging from savant.utils.sink_factories import sink_factory +from savant.utils.welcome import get_starting_message def main(module_config: Union[str, Path, IO[Any]]): @@ -41,13 +42,14 @@ def main(module_config: Union[str, Path, IO[Any]]): config = ModuleConfig().config init_logging(config.parameters['log_level']) + logger = get_logger('main') + logger.info(get_starting_message('module')) # load module config config = ModuleConfig().load(module_config) # reconfigure savant logger with updated loglevel update_logging(config.parameters['log_level']) - logger = get_logger('main') check_display_env(logger) @@ -115,13 +117,14 @@ def build_module_engines(module_config: Union[str, Path, IO[Any]]): config = ModuleConfig().config init_logging(config.parameters['log_level']) + logger = get_logger('engine_builder') + logger.info(get_starting_message('module engine builder')) # load module config config = ModuleConfig().load(module_config) # reconfigure savant logger with updated loglevel update_logging(config.parameters['log_level']) - logger = get_logger('engine_builder') check_display_env(logger) diff --git a/savant/utils/logging/log_utils.py b/savant/utils/logging/log_utils.py index 7161126d..ba0ae45f 100644 --- a/savant/utils/logging/log_utils.py +++ b/savant/utils/logging/log_utils.py @@ -169,14 +169,14 @@ def check_func_conflict(func, name, original_name, is_func, target): if registered_num != 'Level ' + level_name: check_conflict( registered_num != level_num, - 'Level {!r} already registered ' 'in logging module'.format(level_name), + 'Level {!r} already registered in logging module'.format(level_name), ) current_level = getattr(logging, level_name, None) if current_level is not None: check_conflict( current_level != level_num, - 'Level {!r} already defined ' 'in logging module'.format(level_name), + 'Level {!r} already defined in logging module'.format(level_name), ) logging_func = getattr(logging, method_name, None) diff --git a/savant/utils/welcome.py b/savant/utils/welcome.py new file mode 100644 index 00000000..c3d4437e --- /dev/null +++ b/savant/utils/welcome.py @@ -0,0 +1,29 @@ +from savant.utils.version import version + + +def get_welcome_message() -> str: + """Returns the welcome message that is used + when starting Savant container. + """ + version_info = ( + f'Savant Version {version.SAVANT}\n' + f'Savant RS Version {version.SAVANT_RS}\n' + f'DeepStream Version {version.DEEPSTREAM}' + ) + return f'\n============\n== Savant ==\n============\n\n{version_info}\n' + + +def get_starting_message(name: str): + """Returns the message that is used + when starting Savant component (module, adapter). + """ + version_info = ( + f'Savant {version.SAVANT}, ' + f'Savant RS {version.SAVANT_RS}, ' + f'DeepStream {version.DEEPSTREAM}' + ) + return f'Starting the {name}. Packages version info: {version_info}.' + + +if __name__ == '__main__': + print(get_welcome_message())