I believe a Singleton provides a worse interface. It tends to be more verbose, and it is harder to create sub-system local log instances. For example, you might want to set the log verbosity of your graphics subsystem to high, while keeping others low. For low complexity games, I'd probably just use simple procedure calls rather than create a class at all. Any state can be kept in an anonymous namespace.
Or just use std::cout, std::cerr and std::clog directly. I might modify their rdbuf() to output to a in-game console or to a file, or I might use OS-level pipes to capture the output to a file.
When you use a singleton, it is guaranteed that you cannot access the singleton before it is created. Hence getInstance().
You don't have that guarantee with static globals.
I use such a logging singleton for creating html logs. You can represent debugging data much better with that when you are unable to pause the process because it depends on timing etc, which is esp. the case when you are doing games. Well, at least it is an easy method to achieve this.
I made myself a class log and logwriter. logwriter can be derived and output any format such as csv, text or html.
If you say "pls", because it is shorter than "please", I will say "no", because it is shorter than "yes"
http://nightlight2d.de/