@@ -135,7 +135,7 @@ bool Log::installStdoutSink()
135135 return false ;
136136
137137 stdout_sink_ = new StdoutSink;
138- installShellForSink (stdout_sink_->sink , stdout_sink_->nodes , " stdout" );
138+ installShellForSink (stdout_sink_->sink , sink_node_, stdout_sink_->nodes , " stdout" );
139139
140140 return true ;
141141}
@@ -151,7 +151,7 @@ bool Log::uninstallStdoutSink()
151151 if (stdout_sink_ == nullptr )
152152 return false ;
153153
154- uninstallShellForSink (stdout_sink_->nodes , " stdout" );
154+ uninstallShellForSink (sink_node_, stdout_sink_->nodes , " stdout" );
155155
156156 stdout_sink_->sink .disable ();
157157 CHECK_DELETE_RESET_OBJ (stdout_sink_);
@@ -164,7 +164,7 @@ bool Log::installSyslogSink()
164164 return false ;
165165
166166 syslog_sink_ = new SyslogSink;
167- installShellForSink (syslog_sink_->sink , syslog_sink_->nodes , " syslog" );
167+ installShellForSink (syslog_sink_->sink , sink_node_, syslog_sink_->nodes , " syslog" );
168168
169169 return true ;
170170}
@@ -180,7 +180,7 @@ bool Log::uninstallSyslogSink()
180180 if (syslog_sink_ == nullptr )
181181 return false ;
182182
183- uninstallShellForSink (syslog_sink_->nodes , " syslog" );
183+ uninstallShellForSink (sink_node_, syslog_sink_->nodes , " syslog" );
184184
185185 syslog_sink_->sink .disable ();
186186 syslog_sink_->sink .cleanup ();
@@ -195,7 +195,7 @@ bool Log::installFileSink(const std::string &name)
195195 return false ;
196196
197197 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);
199199 file_sinks_.emplace (name, file_sink);
200200 return true ;
201201}
@@ -234,11 +234,12 @@ bool Log::uninstallFileSink(const std::string &name)
234234 auto file_sink = iter->second ;
235235 file_sinks_.erase (iter);
236236
237- uninstallShellForFileSink (file_sink->nodes , std::string ( " file: " ) + name);
237+ uninstallShellForFileSink (file_sink->nodes , name);
238238
239239 file_sink->sink .disable ();
240240 file_sink->sink .cleanup ();
241241 CHECK_DELETE_OBJ (file_sink);
242+
242243 return true ;
243244}
244245
@@ -271,9 +272,9 @@ void Log::initSinkByJson(log::Sink &sink, const Json &js)
271272 }
272273}
273274
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)
275276{
276- nodes.dir = terminal::AddDirNode (*shell_, sink_node_ , name);
277+ nodes.dir = terminal::AddDirNode (*shell_, parent_node , name);
277278
278279 {
279280 terminal::BooleanFuncNodeProfile profile;
@@ -360,20 +361,24 @@ void Log::installShellForSink(log::Sink &sink, SinkShellNodes &nodes, const std:
360361 }
361362}
362363
363- void Log::uninstallShellForSink (SinkShellNodes &nodes, const std::string &name)
364+ void Log::uninstallShellForSink (terminal::NodeToken parent_node, SinkShellNodes &nodes, const std::string &name)
364365{
365366 shell_->deleteNode (nodes.dir );
366367 shell_->deleteNode (nodes.set_enable );
367368 shell_->deleteNode (nodes.set_color_enable );
368369 shell_->deleteNode (nodes.set_level );
369370 shell_->deleteNode (nodes.unset_level );
370371
371- shell_->umountNode (sink_node_ , name);
372+ shell_->umountNode (parent_node , name);
372373}
373374
374375void Log::installShellForFileSink (log::AsyncFileSink &sink, FileSinkShellNodes &nodes, const std::string &name)
375376{
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);
377382
378383 {
379384 terminal::StringFuncNodeProfile profile;
@@ -436,7 +441,13 @@ void Log::uninstallShellForFileSink(FileSinkShellNodes &nodes, const std::string
436441 shell_->deleteNode (nodes.set_sync_enable );
437442 shell_->deleteNode (nodes.set_max_size );
438443
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+ }
440451}
441452
442453}
0 commit comments