Search Unity

  1. Click here to see what's on sale for the "Best of Super Sale" on the Asset Store
    Dismiss Notice
  2. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice

[RELEASED] Debug.Log Extensions

Discussion in 'Assets and Asset Store' started by SisusCo, Mar 17, 2020.

  1. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    title.png

    Enhance the Debug class with numerous improvements that can greatly improve readability in the Console and save a lot of time by enabling more compact debugging code to be used.

    This is a plug & play solution; all Debug commands in your classes will automatically switch to using the new and improved versions.

    Asset Store - Buy Debug.Log Extensions
    Webpage - Find the blog, contact information...
    Join Mailing List - Be in the know


    Features
    ☑ Clean Console
    Stack traces are no longer visible for every entry in the Console list. This greatly improves readability.
    ☑ Syntax Highlighting
    Your console messages are automatically augmented with colorful syntax highlighting, improving readability even more.

    ☑ Automatic Context
    The context Object is automatically determined for your messages whenever possible to help with locating message sources.

    ☑ Channels
    Prefix a log message with a tag inside square brackets to tie it to a specific channel, then show/hide all messages from specific channels.

    ☑ Debug.Log(()=>field)
    A new compact syntax can be used to log both the name and value of a field to the console.

    ☑ Debug.LogChanges(()=>field)
    Have messages be printed automatically whenever the value of a field changes.

    ☑ Debug.LogState(target)
    Easily print the full state of a target to the console.

    ☑ Debug.DisplayOnScreen(()=>field)
    Easily display the name and current value of any field on the screen.

    ☑ Debug.LogToFile(message, path)
    Easily output messages into text files instead of the console.

    ☑ Dev.Log(message)
    Just like Debug.Log except all calls are omitted from release builds.
    ☑ Critical.Log(message)
    Useful for important messages you don't want getting lost in the shuffle; uses a larger font, full stack trace and always gets recorded in a log file.

    ☑ Personal Channel
    Use your personal channel to log messages that are by default omitted from all users except for you.

    ☑ Highly Customizable
    Thorough customization options allow you to configure everything to fit your team as well as your personal preferences.

    ☑ Console+
    As an added bonus you get an augmented Console window with a new control for toggling channels on/off.

    Usage Examples

    ☹ Before:​
    Code (CSharp):
    1. Debug.Log(nameof(target)+"="+(target == null ? "null" : target.ToString()), this);

    ☑ After:​
    Code (CSharp):
    1. Debug.Log(()=>target);

    ⚠ Prints:​
    target=Player​


    ☹ Before:​
    Code (CSharp):
    1. string message = "MyClass state:\n";
    2. message += "speed=" + speed + "\n";
    3. message += "target=" + (target == null ? "null" : target.ToString()) + "\n";
    4. message += "progress=" + progress;
    5. Debug.Log(message, this);

    ☑ After:​
    Code (CSharp):
    1. Debug.LogState(this);

    ⚠ Prints:​
    MyClass state:
    speed=5
    target=null
    progress=0.25​


    ☹ Before:​
    Code (CSharp):
    1. void Update()
    2. {
    3. if(myField != lastValue)
    4. {
    5.   Debug.Log("myField="+(lastValue = myField)+"\n(was: "+lastValue+")", this);
    6.   lastValue = myField;
    7. }
    8. }

    ☑ After:​
    Code (CSharp):
    1. Debug.LogChanges(()=>myField);

    ⚠ Prints:​
    myField=5
    (was: 4)
    myField=6
    (was: 5)​

    Installation

    Once you have installed Debug.Log Extensions you will be asked whether or not you would like to replace the default Debug class across the project.

    If you choose "Yes" and some classes in your project contain the statement "using Debug = UnityEngine.Debug;" it can prevent the project from compiling.
    To fix this you just need to remove the statements from your code - they should no longer be necessary when using Debug.Log Extensions anyways.

    Alternatively you can opt not to replace the default Debug class. In this case you will need to add "using Debug = Sisus.Debugging.Debug;" in any classes where you want to enable Debug.Log Extensions' enhancements.​
     
    Last edited: Mar 18, 2020
  2. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    Update 1.1.1 is now out and adds the following improvements:
    • Extended Debug class with several new LogWarning and LogError methods.
    • Extended Dev class with several new methods.
    • Improved syntax formatting logic.
    • Improved UnityEngine.Object formatting in Log messages.
    • Improved automatic context Object fetching.
     
  3. Jh2556

    Jh2556

    Joined:
    Sep 29, 2014
    Posts:
    10
    Hello! Thanks for this great tool, pretty much just what I was looking for.

    I had a question though. Aside from Dev.Log is there a way of automatically disabling all logs from builds; debug/non-debug.

    I know there are some risks/implications with this, but it'd be very helpful and would save a lot of time from rewriting all the logs when using your tool in large large projects.

    Thanks!
     
  4. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    Hi there @Jh2556 ! I'm glad to hear you've found the asset useful.


    I actually have been considering adding an option that would allow omitting all Debug method calls from release builds. I've been thinking I could also enable this mode automatically whenever the Use Player Log setting is set to false, since all those method calls are just wasted resources in that context anyways.

    Critical.Log should also work together well with this approach, since you could still use it to log a couple of very important errors into a custom Log file for end users, even if all normal Debug.Log calls have been omitted.


    Are you in a hurry to get this functionality? I'm a bit busy with other things right now, but I could start implementing this functionality in about a week's time I think.
     
  5. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    It took a bit longer than I first anticipated, but version 1.1.2 of Debug.Log Extensions now introduces support for removing all logging done using the extended Debug class from release builds.

    When this new option is enabled in the settings all Debug.Log calls will be completely omitted from release builds, including any evaluation done for their parameters. So the cost of any string concatenations, ToString operations etc. in your Debug.Log calls will also get eliminated.

    As mentioned previously, you can still use the new Critical class to bypass this and log some messages in release builds to custom log files. This works even if you have disabled Use Player Log in Player Settings.


    Additionally the syntax highlighting feature has been improved in the new update. When you log a color to the console the text representation will now be tinted using the color in question.

    debug-log-colorized-colors.png

    Full source code is now also bundled with the download inside a unity package, along with a DLL builder. This means that is now possible for users to extend the Debug class with their own code and then integrate those changes into the DLL. Do note though that doing this would also mean losing the ability to update Debug.Log Extensions to newer versions (at least without losing your own changes), so it is not recommended in most situations. But if I should for example die in a car crash tomorrow it might come in handy :D
     
  6. Jh2556

    Jh2556

    Joined:
    Sep 29, 2014
    Posts:
    10
    Woah!! Thanks for this great update!!! :D (sorry I forgot to reply earlier)
     
    SisusCo likes this.
  7. ben-rasooli

    ben-rasooli

    Joined:
    May 1, 2014
    Posts:
    37
    Hi

    I think there is a bug in the Console+ Tab. Channel filtering does not work. The disabled channels still show up in the console.
    Screen Shot 2020-05-30 at 9.08.56 pm.png
    macOS version: 10.14.6
    Unity version: 2020.1.0b10.3837
    Debug.Log Extensions version: 1.1.2

    Edit:
    I also tried on Unity 2019.3.11f1 and the issue still insists.
     
    Last edited: May 30, 2020
  8. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    Hi Ben!

    The channel dropdown works a bit differently than some of the other controls found on the console window. It doesn't actually filter which ones of existing messages are currently listed on the window. Instead it lets you completely disable all messages that are henceforth logged using certain channels.

    Because messages from disabled channels are completely ignored, you don't take the usual performance hit from them, and they don't cause your log file to grow bigger. So you could have hundreds of messages being logged every minute on all sorts of channels like audio, pathfinding and combat, but only have the channels that you currently care about actually be active.

    The downside is that you can't retroactively recover messages from channels that were disabled when the log call was made.
     
    ben-rasooli likes this.
  9. ben-rasooli

    ben-rasooli

    Joined:
    May 1, 2014
    Posts:
    37
    How can I remove a channel?

    Anytime I create a channel either via code or via Project Settings, the channel is created permanently. Even if I remove it from the Project Settings or the code, it still shows up in the Console+ tab.
     
  10. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    The Console+ window will catch it when you use any channels in your debugging code and automatically adds them to the channels popup. This list is currently serialized so that it doesn't get cleared for an open Console+ window even if scripts are recompiled, you enter play mode or stuff like that. This ensures that your settings for enabled/disabled channels won't get reset every time you toggle play mode, restart the editor etc.

    It looks like this list is a bit too persistent as it stands right now - the only way to clear it is by first closing the Console+ window and then restarting the editor or entering / exiting play mode.

    I'll think of ways on how this could be improved in the future, maybe e.g. by allowing the user to manually clear the list.
     
    ben-rasooli likes this.
  11. Jh2556

    Jh2556

    Joined:
    Sep 29, 2014
    Posts:
    10
    Hi @SisusCo. I've been getting this error in Unity 2019.4.1f1

    upload_2020-9-29_18-31-25.png

    Any thoughts? Thanks!!
     
  12. Creepgin

    Creepgin

    Joined:
    Dec 14, 2010
    Posts:
    381
    Can I make a request for the Channel filtering to be actually showing/hiding all messages per channel (instead of just for future logs)? Should be more useful that way.

    Also what does the runtime GUI do exactly? Pressing the Insert key in playmode only shows a small white text: "Dynamic" near the top left corner.

    Pretty cool plugin btw. I just purchased!
     
  13. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    Hi @Jh2556

    It seems like this error can occur if your project contains assets with a bad .meta file containing no guid.

    Here are instructions on how you can find any files with missing guids. You'll need to open Windows PowerShell, change the directory to your project's asset directory and run the command given in that link.

    Hope this helps!
     
  14. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    Hi @Creepgin , thanks for the purchase and the feedback :)

    Currently the Console+ is a very simple wrapper on top of the default Console window and does little more than adds that Channel popup menu to the top.

    I wholly agree that having the popup menu actually filter the contents of the window would be really nice, however this would mean having to rewrite almost all the functionality of the default Console window from scratch. And every time Unity would add new updates to their console window I might also have to update my window to have feature parity. For these reasons I've been wary of going with this approach.

    I have actually done some experimenting with this full rewrite approach, and was able to replicate most of the default console window's features. But some features like maybe device attaching could be problematic to replicate. Perhaps I could still finish it up and offer it as an experimental alternative to the wrapper variant, even if it's missing some features though...

    You can press the Insert key multiple times to cycle through three different modes.
    1. In Dynamic mode the GUI will remain hidden except when Debug.DisplayOnScreen or Debug.ShowFps has been used to display something on the screen.
    2. In Always Visible mode the GUI will always remain visible and also becomes interactive, allowing you to enable and disable channels through it.
    3. In Always Hidden mode the GUI will always remain hidden, even if debugging information is being displayed on screen.
     
    Creepgin likes this.
  15. Creepgin

    Creepgin

    Joined:
    Dec 14, 2010
    Posts:
    381
    Great! Thanks for the clarification. Real tag filtering and regex support may be worth the effort for the standalone new console. ;)
     
  16. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    @Creepgin So, I had a pretty productive weekend and as a result version 1.1.3 is out now with an all-new experimental Console+ window :D

    It can be opened using the menu item Window > Debugging > Console+ (Experimental).

    Regex support didn't quite make it to the first version, but I'll keep that idea in mind for future updates ;)
     
    Creepgin likes this.
  17. SisusCo

    SisusCo

    Joined:
    Jan 29, 2019
    Posts:
    468
    I've made some good progress with the new Console+ window.
    If I'm going to have to write it all from scratch I might as well add some improvements on top :D

    console-plus.png

    (P.S. regex support for the search is now also included :cool:)
     
    Creepgin likes this.
unityunity