Log Dynamic Control Plugin

Plugin Overview

The log_control_plugin registers an RPC based on protobuf protocol definitions, providing runtime management interfaces for Log. Note that log_control_plugin does not provide any communication backend, so this plugin is typically used in combination with RPC backends from other communication plugins, such as the HTTP RPC backend in net_plugin.

The plugin configuration items are as follows:

Node

Type

Optional

Default

Purpose

service_name

string

Yes

“”

RPC Service Name, if left blank, uses the default value generated from the protocol

Here is a simple configuration example combining log_control_plugin with the HTTP RPC backend from net_plugin:

aimrt:
  plugin:
    plugins:
      - name: net_plugin
        path: ./libaimrt_net_plugin.so
        options:
          thread_num: 4
          http_options:
            listen_ip: 127.0.0.1
            listen_port: 50080
      - name: log_control_plugin
        path: ./libaimrt_log_control_plugin.so
  rpc:
    backends:
      - type: http
    servers_options:
      - func_name: "(.*)"
        enable_backends: [http]

LogControlService

In log_control.proto, a LogControlService is defined, providing the following interfaces:

  • GetModuleLogLevel: Get the log level of a module;

  • SetModuleLogLevel: Set the log level of a module;

GetModuleLogLevel

The GetModuleLogLevel interface is used to retrieve the log level of a specific module. Its interface definition is as follows:

message GetModuleLogLevelReq {
  repeated string module_names = 1;  // if empty, then get all module
}

message GetModuleLogLevelRsp {
  uint32 code = 1;
  string msg = 2;

  map<string, string> module_log_level_map = 3;  // key: module_name
}

service ParameterService {
  // ...
  rpc GetModuleLogLevel(GetModuleLogLevelReq) returns (GetModuleLogLevelRsp);
  // ...
}

Developers fill in the module they want to query for the log level in the request packet GetModuleLogLevelReq. If left empty, it returns all modules.

Here is an example using the HTTP RPC backend from net_plugin, calling this interface via HTTP using the curl tool:

curl -i \
    -H 'content-type:application/json' \
    -X POST 'http://127.0.0.1:50080/rpc/aimrt.protocols.log_control_plugin.LogControlService/GetModuleLogLevel' \
    -d '{"module_names": []}'

This example command queries the current log levels of all modules. If the call is successful, the command returns the following:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 84

{"code":0,"msg":"","module_log_level_map":{"core":"Info","ExecutorCoModule":"Info"}}

SetModuleLogLevel

The SetModuleLogLevel interface is used to set the log level of one or more modules. Its interface definition is as follows:

message SetModuleLogLevelReq {
  map<string, string> module_log_level_map = 1;
}

message SetModuleLogLevelRsp {
  uint32 code = 1;
  string msg = 2;
}


service ParameterService {
  // ...
  rpc SetModuleLogLevel(SetModuleLogLevelReq) returns (SetModuleLogLevelRsp);
  // ...
}

Developers fill in the module(s) they want to set the log level for and the corresponding log level in the request packet SetModuleLogLevelReq.

Here is an example using the HTTP RPC backend from net_plugin, calling this interface via HTTP using the curl tool:

#!/bin/bash

data='{
	"module_log_level_map": {
		"core": "Trace",
		"ExecutorCoModule": "Trace"
	}
}'

curl -i \
    -H 'content-type:application/json' \
    -X POST 'http://127.0.0.1:50080/rpc/aimrt.protocols.log_control_plugin.LogControlService/SetModuleLogLevel' \
    -d "$data"

This example command sets the log level to Trace for the core and ExecutorCoModule modules. If the call is successful, the command returns the following:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 19

{"code":0,"msg":""}