Skip to content

Added the ability to redirect logging to a callable. #6244

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: master
Choose a base branch
from

Conversation

larshg
Copy link
Contributor

@larshg larshg commented Mar 1, 2025

I'm in deep water here, but it seems to work :)

Please come with suggestions, before spent too much time in the wrong way.

Could close #5589

@larshg larshg force-pushed the addconsoleredirect branch 10 times, most recently from a544354 to 9eb28fc Compare March 1, 2025 21:13
@larshg
Copy link
Contributor Author

larshg commented Mar 1, 2025

@mvieth do you have any idea to why there is linker errors with pcl::octree:OctreeKey::maxDepth ?

@mvieth
Copy link
Member

mvieth commented Mar 1, 2025

@mvieth do you have any idea to why there is linker errors with pcl::octree:OctreeKey::maxDepth ?

Must have something to do with the usage of maxDepth here: https://github.com/PointCloudLibrary/pcl/blob/master/octree/include/pcl/octree/impl/octree_base.hpp#L98
maxDepth is a static const member, so maybe something related to ODR-use? I have to look at your changes in detail first before I can make a more specific guess.

@larshg
Copy link
Contributor Author

larshg commented Mar 1, 2025

Ahh, its in that print statement it fails... hmm, still odd though.

@larshg larshg force-pushed the addconsoleredirect branch 2 times, most recently from 6d1d0a4 to 44320b0 Compare March 2, 2025 19:44
@larshg
Copy link
Contributor Author

larshg commented Mar 2, 2025

Maybe pcl::console::LogRecorder should be a member of the Logger, to avoid creating a stringstream for each stream command - would that make sense?

@roncapat
Copy link
Contributor

roncapat commented Mar 3, 2025

Nice for me, even if I not like too much the following:

pcl::console::Logger::getInstance().setCallback(...)

because of the getInstance() call... is there a way to remove this indirection level?

Moreover, I think that the previous callback needs to be returned from the setCallaback() call to be able to restore it.

@larshg
Copy link
Contributor Author

larshg commented Mar 3, 2025

Nice for me, even if I not like too much the following:

pcl::console::Logger::getInstance().setCallback(...)

because of the getInstance() call... is there a way to remove this indirection level?

Moreover, I think that the previous callback needs to be returned from the setCallaback() call to be able to restore it.

Somehow the callback needs to be saved - and having just a static global variable to a std::function, didn't seem right either. At least it was the best solution I found, also browsing other logging frameworks.

static Logger instance;
return instance;
}

////////////////////////////////////////////////////////////////////////////////
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

template <typename Functor>
void pcl::console::Logger::setCallback(Functor&& callback){
      getInstance().setCallback(std::move(callback));
}

DISCLAIMER: draft, untested code.
@larshg wouldn't this work? Would the template be a problem there?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You want a free function like:


    template <typename Functor>
    void
    setCallback(Functor&& callback)
    {
      Logger::getInstance().setCallback(std::move(callback));
    }

so you can call:
pcl::console::setCallback(...);

Yes, thats possible.

@roncapat
Copy link
Contributor

roncapat commented Mar 3, 2025

Moreover, why generic template "functor" instead of std::function?

@larshg
Copy link
Contributor Author

larshg commented Mar 3, 2025

Else I couldn't get it to work with lambdas - but maybe I did it wrong 😄

@larshg
Copy link
Contributor Author

larshg commented Mar 3, 2025

To restore normal logging again, you can just set the callback to a nullptr.

@aurelienrb
Copy link

I had a quick look and it looks promising to me, thanks for your work

Copy link
Member

@mvieth mvieth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume we are targeting PCL 1.16.0, due to likely ABI changes?

Is there a way to easily reset to the default behaviour, after calling setCallback? Edit: I just read your other comment: set callback to a nullptr. Please document this in the code somewhere.

}

LogRecorder&
operator<<(std::ostream& (std::ostream&))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one looks strange, what is it for?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was for handling std::endl if I remember correctly - that apparently need this operator.

@@ -210,7 +210,7 @@ CPCSegmentation Parameters: \n\
pcl::PCLPointCloud2 input_pointcloud2;
if (pcl::io::loadPCDFile (pcd_filename, input_pointcloud2))
{
PCL_ERROR ("ERROR: Could not read input point cloud %s.\n", pcd_filename.c_str ());
PCL_ERROR ("ERROR: Could not read input point cloud %s.\n", pcd_filename);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does .c_str() still work? But is not necessary any more?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems it still is necessary. See https://godbolt.org/z/zaca3aGK3 - MSVC output correctly, but GCC output random stuff.

@@ -138,9 +138,14 @@ class OctreeKey {
(!!(this->z & depthMask)));
}

/* \brief maximum depth that can be addressed */
static const unsigned char maxDepth =
static_cast<unsigned char>(sizeof(uindex_t) * 8);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to keep this and deprecate it? Same for max_sample_checks_.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess so - not sure if it will do linking errors downstream though.

{ \
pcl::console::LogRecorder rec; \
rec << ARGS; \
pcl::console::LogRecord entry{pcl::console::LEVEL, rec.to_string()}; \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could there be a way to tell the stringstream of LogRecorder to directly operate on the message string of the LogRecord? Otherwise there are multiple allocations and copies here, I think.

@larshg larshg force-pushed the addconsoleredirect branch from 4248763 to 5384843 Compare March 25, 2025 15:33
@larshg larshg force-pushed the addconsoleredirect branch from 448c188 to 746959d Compare March 25, 2025 15:53
@larshg larshg added this to the pcl-1.16.0 milestone Mar 26, 2025
@larshg larshg requested a review from Copilot March 26, 2025 18:18
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review any files in this pull request.

Files not reviewed (14)
  • common/include/pcl/console/print.h: Language not supported
  • common/src/print.cpp: Language not supported
  • examples/segmentation/example_cpc_segmentation.cpp: Language not supported
  • examples/segmentation/example_lccp_segmentation.cpp: Language not supported
  • octree/include/pcl/octree/impl/octree2buf_base.hpp: Language not supported
  • octree/include/pcl/octree/impl/octree_base.hpp: Language not supported
  • octree/include/pcl/octree/impl/octree_pointcloud.hpp: Language not supported
  • octree/include/pcl/octree/octree_impl.h: Language not supported
  • octree/include/pcl/octree/octree_key.h: Language not supported
  • octree/src/octree_inst.cpp: Language not supported
  • sample_consensus/include/pcl/sample_consensus/sac_model.h: Language not supported
  • test/common/CMakeLists.txt: Language not supported
  • test/common/test_console.cpp: Language not supported
  • tools/train_linemod_template.cpp: Language not supported

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[console] How can I redirect the log output?
4 participants