11 ms·
‘Woof’, a pure Scala 3 logging library
- sg47 5y agoDoes it have jndi support?
- armchairhacker 5y agoI'm sorry but I don't understand why. It seems like this falls for the same kind of over-engineering which caused log4j's issues in the first place. > Announcing Bark! A logging library written purely in C! Blazingly fast! 0 dependencies! It even prints file and line numbers! #ifdef DEBUG #define LOG(msg, ...) printf("[__FILE__ __LINE__]: " msg, ...) #else #define LOG(msg, ...) #endif
- megumax 5y agoNever be so sure, https://twitter.com/vm_call/status/1405937492642123782 https://twitter.com/vm_call/status/1405937492642123782 .
- esarbe 5y agoCould you point to what you think is over-engineered here?
- the_af 5y ago> this falls for the same kind of over-engineering which caused log4j's issues in the first place Because it uses an effects system, which are designed to control side effects like the one which caused log4j's vulnerability, it looks like a reaction against log4j, not "more of the same problem". Whether this is a sound approach or not, I cannot say. But definitely not a case of log4j-like overengineering.
- discodachshund 5y agoSadly the effect system isn't granular to narrow down what effect is happening other than "IO", which could be logging, network, disk access, rm -rf /. And without that visibility it doesn't provide you much advantage. Haskell similarly suffers, I'd like to see IO broken down into composable units of functionality so I can see if e.g. my logging library has some ridiculous network constraint.
- the_af 5y agoI suspect the same re: this library: IO is indeed too broad, and a logging system needs to do IO. You could use other monads though. > Haskell similarly suffers Haskell practitioners aim to write as much code as possible outside the IO monad. If everything you write lives inside that monad, what's the benefit? The nice thing about Haskell is that if you write every function with IO in its signature, it's bound to raise eyebrows in code reviews, whereas in most other mainstream languages everything lives in an IO monad by default!
- thowaway202107 5y agoI think the point was that for that remaining bit that can’t be extracted into pure functions still is really broad in what it can do with just “IO” IO on it’s own could mean disk, network, environment variables, sub processes, etc. My take away is that they’d like to see IO defined as the union of its parts that can also be decomposed, so you’d have a DiskIO monad or ExecIO That way you can be more certain that you’re not accidentally going to do a bunch of network io before your sub process kicks off. Right now you can’t have that guarantee (out of the box, at least. idk if there’re any user land libraries to do such a thing)
- the_af 5y agoAgreed, and as another person commented, a logging system doesn't actually need to live in the (too broad) IO monad.
- still_grokking 5y agoWho isn't waiting to finally get an usable effect system? But there is something on the horizon for Scala: https://github.com/lampepfl/dotty/blob/release-3.1.0/docs/docs/reference/experimental/canthrow.md#outlook https://github.com/lampepfl/dotty/blob/release-3.1.0/docs/do... One can have a proper effect system on the JVM also already today with Flix: https://en.wikipedia.org/wiki/Flix_(programming_language)#Polymorphic_effects https://en.wikipedia.org/wiki/Flix_(programming_language)#Po...
- pjmlp 5y agoAh, but does it also plug into syslog and is able do cluster logging via Sun RPC?
- the_af 5y agoYou jest but we needed syslog in a past job so this snippet indeed wouldn't have worked. The old adage holds true: "users only need 20% of this system's features, but the problem is that every user needs a different 20%!"
- esarbe 5y agoThis is very exciting; one more library making use of the amazing features that come with Scala 3. It's a beautiful and simple language, more so than Scala 2 and I cannot recommend it highly enough for many productive use-cases.
- macpete42 5y agoI don't get it: Why do we need category theory and monads for every little fart?
- the_af 5y agoWhere did you read "category theory" in that article? I'm not familiar with Woof but it looks like an attempt at writing a pure logging lib. What is wrong with that?
- macpete42 5y agothe so called "purity" is achieved by using a higher kinded type and the cats IO monad. it's like adding "1+1" with a "mathematical-calculation-monoid-combine-factory-builder-singleton-locator-evaluator-pattern". I remember keeping it simple as an ultimate goal but maybe I am just too for this FP peeing contest? why is it such a frickin' deal to log a message somewhere?
- the_af 5y ago> why is it such a frickin' deal to log a message somewhere? Need I remind you of the Log4J debacle? It's definitely a big deal. Whether this is the right approach is another matter. PS: trust me, you don't need to read on category theory to use or understand monoids, which at the level they are used in Scala and Haskell code, they are trivial to understand.
- doikor 5y ago> I remember keeping it simple as an ultimate goal but maybe I am just too for this FP peeing contest? why is it such a frickin' deal to log a message somewhere? Don't know about others but for me it is about being able to easily verify that my logging is setup correctly. Once you write your logging to some monad (the library we use does not require it to be IO) testing it becomes trivial with a WriterT monad where it just write your logs into some list/buffer and check that what was logged in various cases was actually what you wanted. We do the same with tracing checking that spans are created as we wanted and the tags/logs on the spans are setup correctly.
- weego 5y agoHaving been primarily a Scala dev for the last 12 years I feel like people have slowly lost their minds over what pragmatic FP in Scala should be. People are willingly recreating the Java situation of 'I don't know the project yet but I know we need Spring!' with these ridiculous libraries from Haskell zealots for no obvious benefit. The ergonomics of this lib out of the box are literally worse for no reason, and worse than most other existing logging libs, because of it
- foobiekr 5y agoAs an observer of this exact phenomenon, I suggest that it is due to the culture that comes with scala. In any given scala-centric organization, there's going to eventually be someone who has mastered the art of talking High Scala. Unless there is someone equally skilled on both dimensions (persuasion and SW eng), and unfortunately, someone approximately as senior, then there is an interative game where added abstraction and complexity become the primary way to distinguish yourself as a "real" engineer. This happens outside of scala shops, and I've seen it there, too, especially in C++ shops, but scala seems to attract these people.
- the_af 5y agoErik Meijer, one of the early practitioners and contributors of Scala, and a coauthor of Odersky's Coursera courses on Scala, believes that "Mostly Functional Programming Doesn't Work" [1] Note it's "mostly functional" that doesn't work, not functional. He believes you have to go all in to reap its benefits, other way you're just deluding yourself with another faddish "miracle cure". All of the above are Meijer's opinions, I'm just the messenger. I know Odersky doesn't share these opinions. My own opinion: I'm unsure. Though I wonder, these days if you're not a strong FP advocate, and instead look to Scala as an improved Java, why not use Kotlin instead? [1] https://queue.acm.org/detail.cfm?id=2611829 https://queue.acm.org/detail.cfm?id=2611829
- pjmlp 5y agoErik Meijer has also brought FP into .NET via VB, a couple of years before Scala was relevant, or F# started to actually matter. So in a sense, he also tried a miracle cure before changing his mind.
- doikor 5y agoThere is also https://github.com/valskalla/odin https://github.com/valskalla/odin for a pure/fp Scala logging library (also includes a slf4j bridge if you need to work with java stuff) It also has some "fancy" features like changing log level if exception happens https://github.com/valskalla/odin#extras-conditional-logging https://github.com/valskalla/odin#extras-conditional-logging Though we have not yet upgraded it to Scala 3 it should work with Scala 3 just fine. (We do compile a Scala 3 release of most of the stuff but the codebase itself is mostly Scala 2 for now)
- jancsika 5y agoIs it possible to inject code from arbitrary urls with this?
- squid_demon 5y agoCan someone please explain the purpose of a logging library (woof, log4j, etc)? There must be something beyond writing text to an external file, possibly with different error levels, that I'm missing. This is a serious question. I truly do not understand what you gain by depending on an external library for this (seemingly) simple operation and would appreciate some insight. Thanks!
- alpaca128 5y agoI was wondering the same, but a recent explanation made sense to me. The idea is to have the ability to control logging of third-party libraries. You might want to see some log messages but you don't want everything spamming stuff into stdout.
- lfischer 5y agoOften logging libraries allow you changing the logging level at runtime, without restarting or recompiling the application, as well as turning logs or off at runtime for different parts of the application. They let you organize logging levels so that when, for example, you turn the level to INFO in one part of the applications, all of the connected code also gets its own log level turned to INFO and you can define which parts of the application should change their log levels in sync. There's also performance considerations, often log libraries claim to implement tricks so that logging is supposed to be faster than naively writing strings to a file.
- the_af 5y agoIf it's just writing to a file or the screen you don't need much. But then you need interpolation of arguments. And other appenders, what about logging to the network for aggregation elsewhere. And logging levels. And a couple more features and corner cases. And before you know it, you're writing a lot of code which could be packaged into a library. But you don't need to, like with most library stuff you could write it in-house yourself.
- eklavya 5y agoI have done Scala for a long time, I had a chance encounter with Spring boot and reflections like no tomorrow style of programming. It was like a wake up call. I knew why I hated the complex juggernaut of the configs and magic but man do I hate to admit, how productive I was once all that was working. Sure someday it would not work and I would need to debug in my IDE but that was rare. I have lived the life of somebody who wants to have every effect annotated, still on some level I believe maybe it can be achieved someday with ergonomics. I have done a lot of rust now and when I look back, I look differently at monads and those abstractions now. Maybe I felt smart using them. There is some value in being able to just look at any library and being able to understand what and how. I have done this a lot in Rust. Scala has some amazing libs and I can't deny that they were immensely powerful, it wasn't easy to make sense of it all though, forget about tweaking and making changes easily. All in all I have come to realise, there is no perfect paradigm, get work done. Use what makes sense. So stop fretting over dart/go, don't bemoan Kotlin, use Scala when you can and don't worry about making everything a kliesli. And really I would not worry about my logger having a side effect. Effect systems still sound cool though, maybe someday. Not worrying about programming languages and code golfing has made me a much better and productive developer, I think.
- travisgriggs 5y ago[flagged]