@@ -135,7 +135,7 @@ bool Log::installStdoutSink()
135
135
return false ;
136
136
137
137
stdout_sink_ = new StdoutSink;
138
- installShellForSink (stdout_sink_->sink , stdout_sink_->nodes , " stdout" );
138
+ installShellForSink (stdout_sink_->sink , sink_node_, stdout_sink_->nodes , " stdout" );
139
139
140
140
return true ;
141
141
}
@@ -151,7 +151,7 @@ bool Log::uninstallStdoutSink()
151
151
if (stdout_sink_ == nullptr )
152
152
return false ;
153
153
154
- uninstallShellForSink (stdout_sink_->nodes , " stdout" );
154
+ uninstallShellForSink (sink_node_, stdout_sink_->nodes , " stdout" );
155
155
156
156
stdout_sink_->sink .disable ();
157
157
CHECK_DELETE_RESET_OBJ (stdout_sink_);
@@ -164,7 +164,7 @@ bool Log::installSyslogSink()
164
164
return false ;
165
165
166
166
syslog_sink_ = new SyslogSink;
167
- installShellForSink (syslog_sink_->sink , syslog_sink_->nodes , " syslog" );
167
+ installShellForSink (syslog_sink_->sink , sink_node_, syslog_sink_->nodes , " syslog" );
168
168
169
169
return true ;
170
170
}
@@ -180,7 +180,7 @@ bool Log::uninstallSyslogSink()
180
180
if (syslog_sink_ == nullptr )
181
181
return false ;
182
182
183
- uninstallShellForSink (syslog_sink_->nodes , " syslog" );
183
+ uninstallShellForSink (sink_node_, syslog_sink_->nodes , " syslog" );
184
184
185
185
syslog_sink_->sink .disable ();
186
186
syslog_sink_->sink .cleanup ();
@@ -195,7 +195,7 @@ bool Log::installFileSink(const std::string &name)
195
195
return false ;
196
196
197
197
auto file_sink = new FileSink;
198
- installShellForFileSink (file_sink->sink , file_sink->nodes , std::string ( " file: " ) + name);
198
+ installShellForFileSink (file_sink->sink , file_sink->nodes , name);
199
199
file_sinks_.emplace (name, file_sink);
200
200
return true ;
201
201
}
@@ -234,11 +234,12 @@ bool Log::uninstallFileSink(const std::string &name)
234
234
auto file_sink = iter->second ;
235
235
file_sinks_.erase (iter);
236
236
237
- uninstallShellForFileSink (file_sink->nodes , std::string ( " file: " ) + name);
237
+ uninstallShellForFileSink (file_sink->nodes , name);
238
238
239
239
file_sink->sink .disable ();
240
240
file_sink->sink .cleanup ();
241
241
CHECK_DELETE_OBJ (file_sink);
242
+
242
243
return true ;
243
244
}
244
245
@@ -271,9 +272,9 @@ void Log::initSinkByJson(log::Sink &sink, const Json &js)
271
272
}
272
273
}
273
274
274
- void Log::installShellForSink (log::Sink &sink, SinkShellNodes &nodes, const std::string &name)
275
+ void Log::installShellForSink (log::Sink &sink, terminal::NodeToken parent_node, SinkShellNodes &nodes, const std::string &name)
275
276
{
276
- nodes.dir = terminal::AddDirNode (*shell_, sink_node_ , name);
277
+ nodes.dir = terminal::AddDirNode (*shell_, parent_node , name);
277
278
278
279
{
279
280
terminal::BooleanFuncNodeProfile profile;
@@ -360,20 +361,24 @@ void Log::installShellForSink(log::Sink &sink, SinkShellNodes &nodes, const std:
360
361
}
361
362
}
362
363
363
- void Log::uninstallShellForSink (SinkShellNodes &nodes, const std::string &name)
364
+ void Log::uninstallShellForSink (terminal::NodeToken parent_node, SinkShellNodes &nodes, const std::string &name)
364
365
{
365
366
shell_->deleteNode (nodes.dir );
366
367
shell_->deleteNode (nodes.set_enable );
367
368
shell_->deleteNode (nodes.set_color_enable );
368
369
shell_->deleteNode (nodes.set_level );
369
370
shell_->deleteNode (nodes.unset_level );
370
371
371
- shell_->umountNode (sink_node_ , name);
372
+ shell_->umountNode (parent_node , name);
372
373
}
373
374
374
375
void Log::installShellForFileSink (log::AsyncFileSink &sink, FileSinkShellNodes &nodes, const std::string &name)
375
376
{
376
- installShellForSink (sink, nodes, name);
377
+ // ! 如果之前没有FileSink,则要创建并挂载files结点
378
+ if (file_sinks_.empty ())
379
+ file_sink_node_ = terminal::AddDirNode (*shell_, sink_node_, " files" );
380
+
381
+ installShellForSink (sink, file_sink_node_, nodes, name);
377
382
378
383
{
379
384
terminal::StringFuncNodeProfile profile;
@@ -436,7 +441,13 @@ void Log::uninstallShellForFileSink(FileSinkShellNodes &nodes, const std::string
436
441
shell_->deleteNode (nodes.set_sync_enable );
437
442
shell_->deleteNode (nodes.set_max_size );
438
443
439
- uninstallShellForSink (nodes, name);
444
+ uninstallShellForSink (file_sink_node_, nodes, name);
445
+
446
+ if (file_sinks_.empty ()) {
447
+ shell_->umountNode (sink_node_, " files" );
448
+ shell_->deleteNode (file_sink_node_);
449
+ file_sink_node_.reset ();
450
+ }
440
451
}
441
452
442
453
}
0 commit comments